从多个表中提取第二列并以制表符分隔打印它们

时间:2014-04-13 01:41:09

标签: sed awk multiple-columns text-parsing

输入文件包含由--分隔的多个表。每个表包含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命令。感谢。

3 个答案:

答案 0 :(得分: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]);
    }
}

答案 1 :(得分:1)

这是另一种方式:

$ 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

答案 2 :(得分:0)

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

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