嘗試在貼上指令中加入換行符

嘗試在貼上指令中加入換行符

這是嘗試包含換行符的貼上命令的弱嘗試:

    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我使用的 scapes,但如果不理解,那麼您可以嘗試將引用的sed腳本替換為:

s/<literal TAB>/\
/3;s//\
/2;s// /g

相關內容