正则表达式生成条件推送

时间:2013-07-26 15:30:30

标签: arrays perl awk push

INPUT

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专家的任何建议?

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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  ___