這是嘗試包含換行符的貼上命令的弱嘗試:
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