我有一个包含整数行的文件。我想删除第二列中的值未出现在任何其他行的第二列中的行。
例如:
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列值唯一的行并将其删除。
答案 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