如何计算文件中的唯一字段?

时间:2013-12-20 08:31:59

标签: perl awk

我在文件夹中有一些文本文件。文本文件的数据如下所示。

USA     Germany   23-12 
USA     Germany   23-12 
USA     Germany   23-12 
France  Germany   15-12
France  Germany   15-12
France  Italy     25-50
China   China     30-32
China   China     30-32

我想根据第三列的数量计算第一和第二列中每个国家/地区的唯一编号。我需要将输出保存到另一个文件夹中作为输入的文件名。

期望的输出

USA       1
Germany   2
France    2
Italy     1
China     2

2 个答案:

答案 0 :(得分:1)

perl -lane'
  $F[2] .= 1 if $F[0] eq $F[1] and $s{$F[0]};
  $s{$_}{$F[2]} = 1 for @F[0,1]; 
  END { printf("$_\t%s\n", scalar keys %{$s{$_}}) for sort keys %s }
' file

如果订单很重要,

perl -lane'
  $F[2] .= 1 if $F[0] eq $F[1] and $s{$F[0]};
  push(@r,$s{$_} ? () : $_), $s{$_}{$F[2]} = 1 for @F[0,1]; 
  END { printf("$_\t%s\n", scalar keys %{$s{$_}}) for @r }
' file

输出

USA     1
Germany 2
France  2
Italy   1
China   2

答案 1 :(得分:1)

鉴于awk中的parse.awk代码:

function get_name(name_colon_x) {
    return substr(name_colon_x, 1, index(name_colon_x, ":") - 1)
}
{
    u1[$1 ":" $3]
    u2[$2 ":" $3]
}
END {
    for (i in u1) u[get_name(i)]++
    for (i in u2) u[get_name(i)]++
    for (i in u) print i, u[i]
}

您的数据位于data.txt,然后是:

$ awk -f parse.awk data.txt
USA 1
France 2
Germany 2
China 2
Italy 1