3

我需要使用 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

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

4

2 回答 2

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
于 2013-10-19T01:09:44.403 回答
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];
    }
}
于 2013-10-20T22:40:34.200 回答