计数和匹配过程

时间:2011-08-10 08:03:22

标签: 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

我怎样才能在awk中这样做?

6 个答案:

答案 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}'