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

时间:2017-11-11 05:24:03

标签: 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  
boot boot boot  
hi hi  

2 个答案:

答案 0 :(得分: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}'

答案 1 :(得分:0)

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

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

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