如何从行中删除重复的数字?

如何从行中删除重复的数字?

输入文件

1 2 3 1 4 5 6 1 1 2 34 5 6 2

我想输出像这样

1 2 3 4 5 6 34 

(所有重复的号码只打印一次)

答案1

Perl 来救援!

perl -lane 'print join " ", grep ! $seen{$_}++, @F' < file
  • -l从输入中删除换行符并将其添加到输出中
  • -n逐行处理输入
  • -a将空格上的每个输入拆分到 @F 数组中

@F 数组通过以下方式迭代grep,仅保留第一次看到的元素(即它们在 %seen 散列中的值为零,因为零的否定为真)。加入只需将它们粘回在一起即可。

答案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

循环数字,如果以前没有见过,则将其添加到调用的数组中unqprintf否则不打印任何内容。

未来阅读:

答案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 | uniqsort

相关内容