使用Bash脚本删除部分重复的行

时间:2015-02-23 09:36:06

标签: bash

我想从文本文件中删除部分重复的行,例如:

1 a 123
1 a 456
1 b 999
2 c 678
3 d 888

如果第一列和第二列的组合重复,我想从文件中删除所有行。

所需的输出

1 b 999
2 c 678
3 d 888

有没有办法使用Bash脚本删除重复的行?

由于

1 个答案:

答案 0 :(得分:0)

目前还不清楚您的数据是如何划分的 - 标签?空间? #chars? - 但是sort应该可以让你排序......: - )

sort -u -k1,2 input.txt

那将使用空格作为分隔符,所以希望无论如何都能解决你的问题。请注意,如果您的数据在此之前没有按顺序,那么这将改变排序顺序 - 浏览手册页我不清楚--check是否可以解决这个问题......

http://man7.org/linux/man-pages/man1/sort.1.html

如果这两个字段中的数据保证相同的字符数,那么您可以使用uniq -w

uniq -w 4 input.txt

快速浏览手册页并没有显示忽略该行末尾字段的选项(-f...跳过该行开头的字段)。

http://man7.org/linux/man-pages/man1/uniq.1.html

如果您不希望sort更改行的顺序,并且您在uniq的列中没有标准字符数,那么您将需要查看awkperl,其中任何一个都可以在一个班轮中完成......

自从我搞砸Perl以来已经好几年了,所以这非常糟糕,但它确实起到了作用:

 perl -e '$l0 = $l1 = ""; while (<>) { @fields = split; print if (@fields[0] != $l0 || @fields[1] != $l1); $l0 = @fields[0]; $l1 = @fields[1]; }' input.txt

Awk可以追溯到更多年,但它可能是比perl更好的工具,因为perl有点矫枉过正:

 awk 'BEGIN { x1 = "xyz"; x2 = "xyz" }
x1 != $1 || x2 != $2 { print "x1="x1 ", 1="$1 ", x2="x2", 2="$2; print $0; x1 = $1; x2 = $2; }' input.txt