![如何从行中删除重复的数字?](https://linux22.com/image/136739/%E5%A6%82%E4%BD%95%E4%BB%8E%E8%A1%8C%E4%B8%AD%E5%88%A0%E9%99%A4%E9%87%8D%E5%A4%8D%E7%9A%84%E6%95%B0%E5%AD%97%EF%BC%9F%20.png)
输入文件
1 2 3 1 4 5 6 1 1 2 34 5 6 2
我想输出像这样
1 2 3 4 5 6 34
(所有重复的号码只打印一次)
答案1
答案2
笔记: 该解决方案使结果保持原始顺序!
awk
使用和可以轻松完成此操作tr
。如果您的内容位于文件中,FILE
:
$ tr ' ' '\n' < FILE | awk '!x[$0]++' | tr '\n' ' '
例子
$ echo "1 2 3 1 4 5 6 1 1 2 34 5 6 2" | \
tr ' ' '\n' | awk '!x[$0]++' | tr '\n' ' '
1 2 3 4 5 6 34
怎么运行的
tr ' ' '\n'
- 将空格切换为换行符awk '!x[$0]++'
- 打印不重复的字符tr '\n' ' '
- 将换行符切换回空格
答案3
和awk
(从整个文件中删除重复项):
awk '{ SEP=""; i=0;
while (++i<=NF) { printf (!unq[$i]++? SEP $i:""); SEP=" "};
print "";
}' infile
或分别从每行中删除重复项:
awk '{ SEP=""; i=0; delete unq;
while (++i<=NF) { printf (!unq[$i]++? SEP $i:""); SEP=" "};
print "";
}' infile
循环数字,如果以前没有见过,则将其添加到调用的数组中unq
,printf
否则不打印任何内容。
未来阅读:
答案4
您可以使用 来执行此操作sort
。排序仅对行进行操作,因此您需要用新行替换文件中的空格。
例如,如果文件test.txt
包含:
1 2 3 1 4 5 6 1 1 2 34 5 6 2
下面的代码将返回你想要的
>sed "s/ /\n/g" test.txt | sort -un
1
2
3
4
5
6
34
请注意, whilesort -u
将返回“唯一”(非重复值),除非您使用 进行数字排序,否则它们将按字母顺序排序sort -n
。此处排序是必要的,因为仅删除连续的重复项,因此无论如何uniq
您都需要进行管道传输。sort -n | uniq
sort