Bash 使用';tr';要将重复的新行打印到单个新行?
我有一个用sort命令排序的单词列表,然后用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
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
压缩同一字符的多个匹配项,而不是同一行。您需要更复杂的处理方法。