如何删除第二列中的值出现特定次数的文件行?

时间:2015-12-17 16:21:24

标签: linux bash shell

我有一个包含整数行的文件。我想删除第二列中的值未出现在任何其他行的第二列中的行。

例如:

4 5 6 // row 0
1 2 3 // row 1
3 3 3 // row 2
4 5 4 // row 3
3 4 5 // row 4
2 2 4 // row 5

第2列的值为3和4,仅在所有行中出现一次。我想删除具有这些唯一列2值,第2行和第4行的行。

我需要按第2列排序,所以我现在拥有的是

$ sort -k2 -n filename > filename_sorted

但我不确定如何识别第2列值唯一的行并将其删除。

3 个答案:

答案 0 :(得分:3)

只处理文件两次:首先计算每个第二列值出现的次数,然后打印出现多次的那些:

$ awk 'FNR==NR{a[$2]++; next} a[$2]>1' file file
4 5 6 // row 0
1 2 3 // row 1
4 5 4 // row 3
2 2 4 // row 5

答案 1 :(得分:0)

这应该对任何awk进行过滤:

awk '
    {
        seen[$2]++ 
        line[$2]=$0
    }
END {
    for (i in seen)
        if (seen[i]==1)
            print line[i]
}' file

对于过滤,如果您碰巧使用gawk 4x,则可以通过添加以下内容一次完成此操作:

BEGIN {PROCINFO["sorted_in"] = "@val_num_asc"}

否则,最简单的方法是将其传递给sort

... | sort -nk2

答案 2 :(得分:0)

您可以使用此sort + awk

sort -k2 -n file | awk 'p == $2{if (r != "") print r; print; r=""} p != $2{p=$2; r=$0}'
1 2 3 // row 1
2 2 4 // row 5
4 5 4 // row 3
4 5 6 // row 0