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

Bash 使用';tr';要将重复的新行打印到单个新行?,bash,Bash,我有一个用sort命令排序的单词列表,然后用uniq-D打印所有的重复单词。输出文件foo.txt如下所示: always always bat bat boot boot boot hi hi 然后,我尝试在脚本中使用以下命令,用tr命令读取文件 它不太正常,输出看起来和上面一样 这就是我到目前为止所做的: cat foo.txt | tr -s '\n' 但是,输出看起来是相同的。我的目标是输出为: always always bat bat

我有一个用sort命令排序的单词列表,然后用
uniq-D
打印所有的重复单词。输出文件
foo.txt
如下所示:

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  

另一个
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文件
,而不是打印的
-D

  2 always
  2 bat
  3 boot
  2 hi
然后打印第一个字段显示的时间:

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

uniq-c文件| awk'{for(i=1;i您可以用uniq换行分隔每个组

之后,sed将此换行符用作字段分隔符

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

tr-d
压缩同一字符的多个匹配项,而不是同一行。您需要更复杂的处理方法。