Bash:根据一列

时间:2017-04-06 16:13:50

标签: bash duplicates

我有一个文件(名为example.txt),如下所示:

A B C  
D E F  
H I C  
Z B Y  
A B C  
T E F  
W O F  

仅基于第2列,我希望识别具有非唯一条目的所有行并将其完全删除。我的真实文件可能有重复项,三重条目,四重条目等。我只想保留第2列条目唯一的行。

输出文件应如下所示:

H I C  
W O F

我最初想在R中这样做,但我的文件太大了,以至于R太慢而且崩溃了。所以我想直接在bash中这样做。我是bash的新手,我试过这个,但它没有用:

arrayTmp=($(cat example.txt | awk '{print $2}' | sort | uniq -d))  
sed "/${arrayTmp[@]}\/d" example.txt

2 个答案:

答案 0 :(得分:1)

如果订单无关紧要:

awk '{a[$2]=$0;b[$2]++}END{for (i in b){if(b[i]==1){print a[i]}}}' your_file

答案 1 :(得分:1)

假设这些字符仅存在于第二列中,这可以通过在example.txt中选择不匹配的行来实现,而不需要数组。

tmp=$(cat example.txt | awk '{print $2}' | sort | uniq -d)
grep -v -f <(echo -e "$tmp") example.txt

输出:

H I C
W O F