如何使用任何 Linux 程序 linke sed、awk 或任何其他程序从文本文件中删除非重复的行?
例子:
abc
bbc
abc
bbc
ccc
bbc
结果:
abc
bbc
abc
bbc
bbc
第二个列表已删除 ccc,因为它没有重复的行。
是否还可以删除不重复的行且只有 2 个重复的行,并保留有 2 个以上重复行的行?
答案1
其他人发布的解决方案不适用于我的 Debian Jessie:他们保留了一个单身的复制任何重复的行,而根据我对 OP 的理解全部重复行的副本应保留。如果我理解正确的话,那么...
以下命令
awk '!seen[$0]++' file
删除所有重复的行。
以下命令
awk 'seen[$0]++' file
输出所有重复项,但不输出原始副本:IE,如果出现一条线n次,它输出行n-1次。
然后命令
awk 'seen[$0]++' file > temp && awk '!seen[$0]++' file >> temp
解决了您的问题。这些行不是按原始顺序排列的。
如果您想要有两个或更多重复项的行,您现在可以迭代上述操作:
awk 'seen[$0]++' file | awk 'seen[$0]++' > temp
保持n-2复制了n>1重复。现在
awk '!seen[$0]++' temp > temp1
从临时文件中删除所有重复的行,现在您就可以获得您想要的内容(IE只有n>1重复项)如下:
cat temp1 >> temp; cat temp1 >> temp
如果需要对出现的行执行此操作否或更多次,以下命令
awk 'seen[$0]++ && seen[$0] > N' file
比链接更简单否次命令
awk 'seen[$0]++' file
。
答案2
您可以使用sort
&uniq
命令来实现这一点。
如果您的数据在 abc.txt 文件中,那么;
cat abc.txt |sort|uniq -d
输出将是;
abc
bbc
答案3
@UUU 的答案没有保持排序顺序。要保持排序顺序,请改用以下内容:
printf '%s\n' abc bbc abc bbc ccc bbc | \
nl -nrz | \
sort -k2 | \
uniq -f1 -D | \
sort | \
cut -f2
- 该
printf
命令只是重现输入。 nl
命令会在行号后附加前导零,以允许sort
不使用-V
标志。sort
命令按第二个字段排序。默认情况下,字段以空格分隔。uniq
命令识别唯一的相邻行(这就是为什么您必须先排序)并-f1
跳过第一个字段,即行号。sort
再次恢复原始顺序。cut
删除前导行号。