붙여넣기 명령에 줄바꿈을 추가하려고 합니다.

붙여넣기 명령에 줄바꿈을 추가하려고 합니다.

개행 문자를 포함시키려는 붙여넣기 명령의 약한 시도는 다음과 같습니다.

    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}에서 이를 정렬하고 , 다음에 줄 바꿈을 추가하고 {last}, {address}각 항목에 대해 \tABS를 로 변환한 <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

관련 정보