3

BASH を使用して、長さの異なる列を 1 つの列に結合する必要があります。入力ファイルの例を次に示します。

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

入力データは、示されているように列のペアです。各ペアは、一定数のスペースで区切られています。列のペア内の値は、1 つのスペースで区切られます。前もって感謝します!

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 に答える