1列の複数の値を定数で除算するには?

1列の複数の値を定数で除算するには?

両方の列の値を任意の定数で除算しようとしています。ただし、各列にはコロンで区切られた複数の値があります。ファイルが非常に大きい(24ファイル、それぞれ2〜3GB)。たとえば、私のファイルのレイアウトは次のようになります。

1   18  N   112:0:0:0:0:0   126:0:0:0:0:0   19:0:0:0:0:0    20:0:0:0:0:0
1   19  N   0:0:114:0:0:0   0:0:136:0:0:0   0:0:18:0:0:0    0:0:19:0:0:0
1   20  N   0:112:0:0:0:7   0:125:0:0:0:20  0:16:0:0:0:3    0:13:0:0:0:5

出力が次のようになります。

1   18  N   56:0:0:0:0:0    63:0:0:0:0:0    19:0:0:0:0:0    20:0:0:0:0:0
1   19  N   0:0:57:0:0:0    0:0:68:0:0:0    0:0:18:0:0:0    0:0:19:0:0:0
1   20  N   0:56:0:0:0:3.5  0:62.5:0:0:0:10 0:16:0:0:0:3    0:13:0:0:0:5

ベストアンサー1

(@berndbauschの使い方のアイデアを繰り返すsplit)awkには、配列を文字列に再プレーンする組み込みの方法がないので、これは完全に簡単ではありません。私たちはprintfを使用する必要があり、その結果、awkは出力をうまく整列させる方法を忘れます。

しかし、動作します。

#! /usr/bin/gawk -f

function print_div2(arr) {
    split(arr, a, ":")
    printf(" %d", a[1]/2)
    delete a[1]
    for(i in a) printf(":%d", a[i]/2)
}

{
    ORS=""
    print $1, $2, $3 " "
    print_div2($4)
    print " "
    print_div2($5)
    print " "
    ORS="\n"
    print $6, $7
}

print注:ORSは、各レコードが処理されるまで改行を抑制するために使用されます。フィールド 4 と 5 を print_div2 関数に割り当てます。この関数はレコードを配列に分割し、各項目の半分を印刷します。

ファイルに入れて実行可能としてマークします。使用例:

$ ./process.awk data.txt
1 18 N  56:0:0:0:0:0  63:0:0:0:0:0 19:0:0:0:0:0 20:0:0:0:0:0
1 19 N  0:0:57:0:0:0  0:0:68:0:0:0 0:0:18:0:0:0 0:0:19:0:0:0
1 20 N  0:56:0:0:0:3  0:62:0:0:0:10 0:16:0:0:0:3 0:13:0:0:0:5

次のコマンドを使用して、きちんとした列の並べ替えを復元できますcolumn

$ ./process.awk data.txt | column -t
1  18  N  56:0:0:0:0:0  63:0:0:0:0:0   19:0:0:0:0:0  20:0:0:0:0:0
1  19  N  0:0:57:0:0:0  0:0:68:0:0:0   0:0:18:0:0:0  0:0:19:0:0:0
1  20  N  0:56:0:0:0:3  0:62:0:0:0:10  0:16:0:0:0:3  0:13:0:0:0:5

おすすめ記事