다음은 줄 바꿈을 포함하는 붙여넣기 명령에 대한 약한 시도입니다.
paste -d -s tmp1 tmp2 \n tmp3 \n tmp4 tmp5 tmp6 > tmp7
기본적으로 각 tmp에는 몇 줄이 있고 출력을 읽고 싶습니다.
First(tmp1) Last(tmp2)
Address(tmp3)
City(tmp4) State(tmp5) Zip(tmp6)
붙여넣기 명령에 개행 문자를 사용하면 기본에서 벗어나 있습니까?
완성된 제품은 다음과 같습니다. 도움을 주셔서 감사합니다!
cp phbook phbookh2p5
sed 's/\t/,/g' phbookh2p5 > tmp
sort -k2 -t ',' -d tmp > tmp0
cut -d',' -f1,2 tmp0 > tmp1
cut -d',' -f3 tmp0 > tmp2
cut -d',' -f4,5,6 tmp0 > tmp3
echo "" > tmp4
paste -d '\n' tmp1 tmp2 tmp3 tmp4 > tmp7
sed 's/\t/ /g' tmp7 > phbookh2p5
cat phbookh2p5
rm tmp*; rm phbookh2p5
답변1
두 개의 추가 임시 파일을 사용하여 이 해결 방법을 시도해 보세요.
paste tmp1 tmp2 > tmp12
paste tmp4 tmp5 tmp6 > tmp456
paste -d "\n" tmp12 tmp3 tmp456 > tmp7
-d
이 솔루션은 옵션이 구분 기호를 선택한다는 가정을 기반으로 합니다.세계적인모든 입력 파일에 대해 비어 있습니다.또는개행 문자. 이는 이후의 이벤트가 -d
이전 이벤트를 덮어쓰기 때문에 어느 정도 사실입니다 . 그러나 @DigitalTrauma가 지적했듯이 순차적으로 사용되는 여러 구분 기호를 제공할 수 있습니다. 따라서 @DigitalTrauma의 솔루션은 추가 임시 파일을 완전히 방지하기 때문에 내 솔루션보다 더 우아합니다.
내 솔루션의 틈새 응용 프로그램은 하나 이상의 구분 기호가 있는 상황입니다.각각 하나 이상의 문자사용해야 합니다. 이 옵션만으로는 불가능합니다 -d
.
답변2
paste
나는 매뉴얼 페이지의 이 부분이 당신이 원하는 것이라고 생각합니다 :
-d, --delimiters=LIST reuse characters from LIST instead of TABs
따라서 이 줄은 귀하의 경우에 적합해야 합니다.
paste -d" \n\n " tmp1 tmp2 tmp3 tmp4 tmp5 tmp6 > tmp7
@DopeGhoti의 샘플 데이터로 예상대로 작업:
$ grep . tmp*
tmp1:Bill
tmp1:Bob
tmp2:Kerman
tmp2:Germin
tmp3:123 Main St.
tmp3:321 Sesame St.
tmp4:Kerbopalis
tmp4:Kerbington
tmp5:Kerbskatchewan
tmp5:Kermont
tmp6:12345
tmp6:31416
$ paste -d" \n\n " tmp1 tmp2 tmp3 tmp4 tmp5 tmp6
Bill Kerman
123 Main St.
Kerbopalis Kerbskatchewan 12345
Bob Germin
321 Sesame St.
Kerbington Kermont 31416
$
paste
저는 GNU Coreutils 5.97 및 8.21과 BSD(OS X)를 사용하여 이를 성공적으로 테스트했습니다. 다른 버전의 페이스트가 있는지 잘 모르겠습니다.
답변3
이 명령이 작동해야 합니다.
paste -s tmp1 tmp2 -d '\n' tmp3 -d '\n' tmp4 tmp5 tmp6 > tmp7
답변4
sort -dk2,2 phpbook |
sed "s/\t/\n/3;s//\n/2;s// /g"
phpbook
내가 이해한 바에 따르면 다음과 같은 전화번호부 항목 줄이 포함 된 파일이 있습니다 .
{first}\t{last}\t{address}\t{city}\t{state}\t{zip}
이를 정렬하고 {last}
및 뒤에 개행을 추가하고 각 항목에 대해 ABS를 로 변환한 다음 결과를 로 인쇄하려고 합니다. 그렇지 않은 경우에는 귀하의 명령이 또 무엇을 할 것인지 알 수 없습니다. 그러나 때로는 매우 조밀해질 수 있습니다. {last}
{address}
\t
<spaces>
stdout
기본적으로 sort
문자로 구분되므로 <TAB>
다음과 같습니다.
sed 's/\t/,/g' | sort ... -t ,
...아마도 할 가치가 없을 것 같습니다.
좀 더 생각해 보면 구분 기호가 혼합되어 있을 가능성이 높으며 sed
이를 표준화하기 위해 이니셜이 있는 것 같습니다. 말이 되네요. 아마도 다음과 같습니다:
1,2\t3\t4,5,6
...또는 다른 것. 이 경우 일종의 초기 번역이 필요합니다. 그럼 어쩌면...
tr , \\t <phbook | sort ... | sed ...
효과가 더 좋아질 것입니다. 반품...
sort ... -k 2
...가능한sort
극단적인 경우에는 문제가 발생 합니다 . 왜냐하면 당신이 그것을 사용할 때,오직두 번째 필드, 두 번째 필드부터 줄 끝까지. 일반적으로 사람들은 이 작업을 수행할 때 -k2,2
데이터 sort
고려 사항을 제한하기를 원합니다.오직두 번째 필드.
다음과 같이 보조 키를 추가하는 것도 가치가 있을 수 있습니다.
...sort -dk2,2 -k1,1
...이것은sort
주로성에 대해서둘째이름에 대해서. 이 방법으로제드 스미스따를 것이다알파 스미스매번.
어쨌든, 내가 옳다면 sort | sed
위의 파이프가 전체 작업을 수행해야 합니다. 나는 당신이 내가 사용하고 있는 풍경을 sed
이해한다고 가정 \e
하지만, 그렇지 않다면 sed
인용된 스크립트를 다음으로 대체해 볼 수 있습니다.
s/<literal TAB>/\
/3;s//\
/2;s// /g