我遇到了与awk匹配的问题:(
我将计算main.file中的第一个列元素,如果它的值大于2,我将打印第一列和第二列。
main.file
1725009 7211378
3353866 11601802
3353866 8719104
724973 3353866
3353866 7211378
例如,第一列中的“3353866”的数量为3,因此output.file将是这样的:
output.file
3353866 11601802
3353866 8719104
3353866 7211378
我怎样才能在awk中这样做?
答案 0 :(得分:1)
如果您指的是至少出现3次的项目,您可以在一个数组中收集事件,并将收集的值收集为另一个数组中预先格式化或分隔的字符串。
awk '{o[$1]++;v[$1]=v[$1] "\n" $0}
END{for(k in o){if(o[k]<3)continue;
print(substr(v[k],1)}' main.file
未经测试,不在我的电脑上。输出顺序基本上是随机的;如果您要求订单稳定,您将需要另一个变量来跟踪行号。
这在Perl或Python中稍微不那么苛刻,其中hash / dict可以包含结构化值,例如列表。
答案 1 :(得分:1)
另一种方法是两次运行文件:它有点慢,但代码非常整洁:
awk '
NR==FNR {count[$1]++; next}
count[$1] > 2 {print}
' main.file main.file
答案 2 :(得分:0)
awk '{store[$1"-"lines[$1]] = $0; lines[$1]++;}
END {for (l in store) {
split(l, pair, "-"); if (lines[pair[1]] > 2) { print store[l] } } }'
答案 3 :(得分:0)
一种方法是跟踪所有记录,每条记录的相应密钥$1
以及每个密钥发生的频率。一旦你为所有行记录了那些,你就可以遍历所有存储的记录,只打印那些密钥计数大于2的记录。
awk '{
record[NR] = $0;
key[$0] = $1;
count[$1]++
}
END {
for (n=1; n <= length(record); n++) {
if (count[key[record[n]]] > 2) {
print record[n]
}
}
}'
答案 4 :(得分:0)
先排序,然后使用awk仅在第1个字段有3次或更多次时打印:
cat your_file | sort -n | awk 'prev == $1 {count++; p0=p1; p1=p2; p2=$2}
prev != $1 {prev=$1; count=1; p2=$2}
count == 3 {print $1 " " p0; print $1 " " p1; print $1 " " p2}
count > 3 {print $1 " " $2}'
这样可以避免awk在输入大文件时使用太多内存。
答案 5 :(得分:0)
根据问题的外观和Ray Toal编辑,我猜你的意思是基于计数,所以这样的事情有效:
awk '!y[$1] {y[$1] = 1} x[$1] {if(y[$1]==1) {y[$1]==2; print $1, x[$1]}; print} {x[$1] = $2}'