両方の列の値を任意の定数で除算しようとしています。ただし、各列にはコロンで区切られた複数の値があります。ファイルが非常に大きい(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
答え2
awk '
function dyd(col, n){
split(col, t, ":");
sep=":";
return t[1]/n sep t[2]/n sep t[3]/n sep t[4]/n sep t[5]/n sep t[6]/n;
};
{ $4=dyd($4, 2); $5=dyd($5, 2); }1' infile |column -t