Awk 计数和匹配过程

Awk 计数和匹配过程,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

我与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中执行此操作?

如果您指的是至少出现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的输入。不同意……但你提供了一个解释,表明你在背后投入了一些思考。