在BASH中将多个不同长度的列组合成一列

时间:2013-10-19 00:21:52

标签: bash shell awk

我需要使用BASH将不同长度的列组合成一列。这是一个示例输入文件:

11  1 2   3 4   5 6   7 8
12  1 2   3 4   5 6   7 8
13  1 2   3 4   5 6   7 8
14  1 2         5 6   7 8
15  1 2               7 8

我想要的输出:

1
1
1
1
1
3
3
3
5
5
5
5
7
7
7
7
7

输入数据是一对列,如图所示。每对通过固定数量的空间与另一对分开。一对列中的值由一个空格分隔。提前谢谢!

2 个答案:

答案 0 :(得分:4)

使用GNU awk进行固定宽度的字段处理:

$ cat file
1 2   3 4   5 6   7 8
1 2   3 4   5 6   7 8
1 2   3 4   5 6   7 8
1 2         5 6   7 8
1 2               7 8

$ cat tst.awk                          
BEGIN{ FIELDWIDTHS="1 1 1 3 1 1 1 3 1 1 1 3 1 1 1" }
{
    for (i=1;i<=NF;i++) {
        a[NR,i] = $i
    }
}
END {
    for (i=1;i<=NF;i+=4)
        for (j=1;j<=NR;j++)
            if ( a[j,i] != " " ) 
                print a[j,i]
}

$ gawk -f tst.awk file
1
1
1
1
1
3
3
3
5
5
5
5
7
7
7
7
7

答案 1 :(得分:0)

您可以尝试以下方法:

awk -f ext.awk input.txt

其中input.txt是您的输入数据文件,ext.awk是:

BEGIN {
    ncols=4 # number of columns
    nspc=3  # number of spaces that separates the columns
}
{
    str=$0;
    for (i=1; i<=ncols; i++) {
        pos=match(str,/^([0-9]+) ([0-9]+)/,a)
        if (pos>0) {
           b[NR,i]=a[1]
           if (NR==1) colw[i]=RLENGTH;  #assume col width are given as in first row
        }
        str=substr(str,colw[i]+1+nspc);
    }
}
END {
    for (i=1;i<=ncols;i++)
        for (j=1;j<=NR;j++) {
            if (b[j,i]) print b[j,i];
    }
}