2017-11-11 76 views
0

我有我使用排序命令排序的單詞列表,然後使用uniq -D打印所有重複單詞。輸出文件foo.txt如下:使用'tr'將重複的新行打印到單個新行?

always 
always 
bat 
bat 
boot 
boot 
boot 
hi 
hi 

我然後嘗試使用下面的命令腳本讀取與tr命令文件。

這不太合適,輸出看起來和上面一樣。

這是我到目前爲止有:

cat foo.txt | tr -s '\n' 

輸出,然而,出現相同。我的目標是輸出爲:

always always 
bat bat 
boot boot boot 
hi hi 
+0

'tr -d'擠在一起出現多個相同的*字符*,而不是同一行。你需要更復雜的東西。 –

+0

請看看:[我應該怎麼做當有人回答我的問題?](http://stackoverflow.com/help/someone-answers) – Cyrus

回答

1

另一awk

awk '{c=(($0!=p)?"\n":" "); printf c $0} {p=$0}' file 
  • c是任何單詞之前打印的字符。
  • p是前一個詞。
  • 如果前面的單詞不同,請將c設置爲換行符或將其設置爲空格。

它打印換行的開頭和結尾沒有換行,因此我們可以添加幾個:

awk '{c=(($0!=p)?"\n":" "); p=$0} NR==1{printf $0;next} {printf c $0} 
    END {printf "\n"}' file 


另一種解決方案,你可以運行 uniq -c file代替 -D它打印

2 always 
    2 bat 
    3 boot 
    2 hi 

然後打印第一個字段說的時間字:

uniq -c file | awk '{for (i=1;i<$1;i++) printf $2 " "; print $2}' 
0

您可以用uniq以換行符分隔每個組。

之後sed把這個換行符作爲字段分隔符。

uniq --all-repeated=separate infile | sed ':A;$bB;/\n$/!{N;bA};:B;s/\n/ /g'