붙여넣기 명령에 개행 문자를 추가해 보세요.

붙여넣기 명령에 개행 문자를 추가해 보세요.

다음은 줄 바꿈을 포함하는 붙여넣기 명령에 대한 약한 시도입니다.

    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

관련 정보