【问题标题】:Extract the 2nd columns from multiple tables and print them tab-delimited从多个表中提取第二列并以制表符分隔打印
【发布时间】:2014-05-27 02:51:15
【问题描述】:

输入文件包含由-- 分隔的多个表。每个表包含 3 列。我想从每个表中取出第二列,并以制表符分隔的表打印列值。

输入文件:

402     52      2
403     68      0
404     0       0
405     0       0
407     1       3
--
1315    0       0
1316    0       0
1317    335     0
1318    2       3
1319    0       0
--
1892    0       0
1893    1       4
1894    0       0
1895    920     0
1896    2       3

输出文件:

52  0   0
68  0   1
0   335 0
0   2   920
1   0   2

请建议使用awksed 命令。谢谢。

【问题讨论】:

    标签: sed awk multiple-columns text-parsing


    【解决方案1】:

    使用以下 awk 脚本:

    #!/usr/bin/awk
    
    BEGIN { nc=1; nr_ = 1; maxr = 1;}
    /^--$/ {
        if (maxr < nr_ )
            maxr = nr_;
        nc++; nr_=1;
        next;
    }
    { col[nc, nr_++] = $2; }
    END {
        for(r = 1; r < maxr ; r++) {
            for(c = 1; c < nc - 1; c++) {
                printf("%s\t", col[c, r]);
            }
            printf("%s\n", col[nc-1, r]);
        }
    }
    

    【讨论】:

    • 非常感谢您编写这个程序。它正在工作。
    • @FIROZ:如果此答案解决了您的问题,请单击旁边的大复选标记接受它。此外,如果其他答案也有帮助,您可以投票。
    【解决方案2】:

    这是另一种方式:

    $ awk '
    NF>1{++count; col[count]=(flag)?col[count] "\t" $2:$2; next}
    {max=(max>count)?max:count; count=0; flag=1}
    END{for(c=1;c<=max;c++) print col[c]}' file
    52   0    0
    68   0    1
    0    335  0
    0    2    920
    1    0    2
    

    【讨论】:

    • +1;干得好:既简洁又高效;您正在通过在一维数组中逐行收集表中的列值来构建输出行(但更具描述性的变量名称会很好:)
    【解决方案3】:

    由于数据是重复的,您可以这样做:

    awk 'NR%6 {if (NR%6==1) f++;a[f FS NR%6]=$2} END {for (i=1;i<=6;i++) {for (j=1;j<=f;j++) printf "%s\t",a[j FS i];print ""}}' file
    52      0       0
    68      0       1
    0       335     0
    0       2       920
    1       0       2
    

    awk '
    NR%6 {
        if (NR%6==1)
            f++
        a[f FS NR%6]=$2}
    END {
        for (i=1;i<=6;i++) {
            for (j=1;j<=f;j++) printf "%s\t",a[j FS i]
            print ""}
        }' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 2011-05-02
      • 2013-05-23
      • 2019-10-01
      • 2019-09-27
      • 2016-05-29
      • 2023-03-03
      • 2020-04-04
      相关资源
      最近更新 更多