我想从文本文件中删除部分重复的行,例如:
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脚本删除重复的行?
由于
答案 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
的列中没有标准字符数,那么您将需要查看awk
或perl
,其中任何一个都可以在一个班轮中完成......
自从我搞砸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