使用'tr'将重复的新行打印到单个新行?

问题描述:

我有我使用排序命令排序的单词列表,然后使用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://*.com/help/someone-answers) – Cyrus

另一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}' 

您可以用uniq以换行符分隔每个组。

之后sed把这个换行符作为字段分隔符。

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