1

输入

fish \t 1 \t red

fish \t 2 \t blue

fish \t 4 \t green

dog \t 1 \t blue

dog \t 3 \t yellow

cat \t 3 \t orange

输出:

fish \t red  \t blue \t _______ \t green

dog  \t blue \t ____ \t yellow 

cat  \t ____ \t ____ \t orange

我希望生成一个数组,同时保持输入文件中第 2 列给出的顺序。在这个例子中,由于没有第 2 列 = 3 的行,我希望用“”推动。

我正在使用的实际文件最多有 98 个位置来填充一个数组。

Perl 专家有什么建议吗?

谢谢!

4

2 回答 2

1

试试这个(你可以更改"___"FS):

$ awk '
    BEGIN { FS=OFS="\t" }
    NR==1 { a=$1; b[$2]=$3; next; }
    $1==a { b[$2]=$3; f2=$2; next; }
    {
      printf "%s\t",a; 
      for(i=1;i<=f2;i++) { printf (b[i]) ? b[i] FS : "___" FS }
      a=$1;
      delete b;
      b[$2]=$3;
      print ""
    }
    END { 
      printf "%s\t",a; 
      for(i=1;i<=f2;i++) { printf (b[i]) ? b[i] FS : "___" FS }
      print ""
    }' file
fish    red     blue    ___     green
dog     blue    ___     yellow
cat     ___     ___     orange
于 2013-07-26T16:57:54.967 回答
0
$ awk -F'\t' '
!seen[$1]++ { keys[++k] = $1 }
NR==1 { min = max = $2 }
{
    min = ($2<min?$2:min)
    max = ($2>max?$2:max)
    map[$1,$2] = $3
}
END {
    for (k=1;k in keys;k++) {
        key = keys[k]
        printf "%s", key
        for (c=min; c<=max; c++) {
            val = ( (key,c) in map ? map[key,c] : "___" )
            printf "%s%s", FS, val
        }
        print ""
    }
}
' file
fish    red     blue    ___     green
dog     blue    ___     yellow  ___
cat     ___     ___     orange  ___
于 2013-07-27T00:12:50.483 回答