Awk 计数和匹配过程
我与awk存在匹配问题: 我将统计main.file中的第一列元素,如果其值大于2,我将打印第一列和第二列 main.fileAwk 计数和匹配过程,awk,match,Awk,Match,我与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 如何在a
1725009 7211378
3353866 11601802
3353866 8719104
724973 3353866
3353866 7211378
例如,第一列中3353866的数字是3,因此output.file如下所示:
output.file
3353866 11601802
3353866 8719104
3353866 7211378
如何在awk中执行此操作?如果您指的是至少出现3次的项,则可以在一个数组中收集出现的项,并在另一个数组中收集作为预格式化或分隔字符串的值
awk '{store[$1"-"lines[$1]] = $0; lines[$1]++;}
END {for (l in store) {
split(l, pair, "-"); if (lines[pair[1]] > 2) { print store[l] } } }'
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中,这会稍微不那么粗俗,其中哈希/dict可以包含结构化值,例如列表。一种方法是跟踪看到的所有记录,每个记录对应的键$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]
}
}
}'
另一种方法是对文件运行两次:速度稍微慢一点,但代码非常简洁:
awk '
NR==FNR {count[$1]++; next}
count[$1] > 2 {print}
' main.file main.file
首先排序,然后仅当第一个字段有3次或3次以上时才使用awk打印:
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在输入文件太大的情况下使用太多内存。根据问题的外观和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}'
你的意思是如果第一列数字的第一位数字大于2?如果是,为什么724973不算?不,我不是指数字。我指的是数字。另一个例子应该是这样的:那么你能重新格式化这个问题吗?所有第一列数字都大于2。我可能把它编辑错了。谢谢。@Ray,我同意,这个问题没有意义-1您可以在一次通行证内完成此操作您刚刚获得[UUoC award}:-不需要cat,sort可以直接将文件作为输入…@Fredrick:我知道sort可以直接将文件作为输入,但我认为这样更清楚,特别是显示输入可以来自文件以外的其他地方。同样的情况也适用于我编写cat文件的awk“一个非常大的脚本”文件| awk“一个非常大的纸条”我认为t'with更清楚地理解和理解awk的输入。不同意……但你提供了一个解释,表明你在背后投入了一些思考。