【问题标题】:Regular expression to generate a conditional push生成条件推送的正则表达式
【发布时间】:2013-07-26 23:04:01
【问题描述】:

输入

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 专家有什么建议吗?

谢谢!

【问题讨论】:

  • 我最终在 perl 中找到了解决方案:
    #!/usr/bin/perl open DOC, $filename while ($line = ) { @columns = split(' \s', $线); if ($columns[0] ne $animal) { &PRINT(); &重置(); } $color[100] = (undef); $color[$columns[1]-1] = $columns[2]; } &打印(); } 关闭文档;退出;

标签: arrays perl awk push


【解决方案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

【讨论】:

    【解决方案2】:
    $ 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  ___
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-19
      • 2021-10-06
      • 2011-10-30
      • 2022-01-14
      • 2016-08-19
      • 2011-08-17
      • 2019-06-27
      • 1970-01-01
      相关资源
      最近更新 更多