次の構造のファイルがあります。
Ti 1.9699858320 2.0810775390 4.162155079 5.20200
O 1.6428341970 2.0810775390 4.162155079 -2.14259
O 1.6428341970 2.0810775390 4.162155079 -2.14259
Pb 4.1621550790 4.1621550790 4.192557641 3.39279
O 3.7662066970 4.1621550790 4.192557641 -4.29652
Ti 6.1302323500 6.2584338990 4.192557641 5.23841
O 5.8163744340 6.2584338990 4.192557641 -2.13267
O 5.8163744340 6.2584338990 4.192557641 -2.13267
Pb 8.3547127200 8.3547127200 4.196295567 3.40984
O 7.9266344100 8.3547127200 4.196295567 -4.36260
Ti 10.318243871 10.452860504 4.196295567 5.26652
O 9.9935741680 10.452860504 4.196295567 -2.13625
O 9.9935741680 10.452860504 4.196295567 -2.13625
Pb 12.551008287 12.551008287 4.193631562 3.43289
O 12.112224767 12.551008287 4.193631562 -4.38552
以下を行う必要があります。
- 2列から3列を引きます。)
1)の結果に5列を掛けます。次のようにします。
awk '{print $0," ",($2-$3)*$5 > "file-out.dat"}' file-in.dat
(これは難しい部分です。)結果は次のとおりです。 2)5つの項目で構成される各グループの合計を求める必要があります。ポイント2)以降のファイル形状は次のとおりです。 5つのグループの最後の列に項目を追加し、結果を次のように作成する必要があります。
Ti 1.9699858320 2.0810775390 4.162155079 5.20200 -0.577899 1 result_of_sum_of_first_group_of_5
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976 2 result_of_sum_of_second_group_of_5
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976 3 result_of_sum_of_third_group_of_5
Pb 4.1621550790 4.1621550790 4.192557641 3.39279 0
O 3.7662066970 4.1621550790 4.192557641 -4.29652 1.7012
Ti 6.1302323500 6.2584338990 4.192557641 5.23841 -0.671572
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
Pb 8.3547127200 8.3547127200 4.196295567 3.40984 0
O 7.9266344100 8.3547127200 4.196295567 -4.36260 1.86753
Ti 10.318243871 10.452860504 4.196295567 5.26652 -0.708961
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
Pb 12.551008287 12.551008287 4.193631562 3.43289 0
O 12.112224767 12.551008287 4.193631562 -4.38552 1.92429
awk 1行でこれをすべて行う方法はありますか?
ベストアンサー1
2つのステップにわたって2つの一時ファイルを使用します。
最初のステップ:正確に6つの列と3つのtmpfile1
グループの合計を含む中間ファイルを次のように作成します。Ti
tmpfile2
awk '{ $6 = ($2 - $3)*$5; print }' OFS="\t" file | tee tmpfile1 |
awk '$1 == "Ti" && NR > 1 { print ++i, sum; sum = 0 } { sum += $6 } END { print ++i, sum }' OFS="\t" >tmpfile2
最初のawk
コマンドは、数式に基づいて計算された値を含む6番目の列を追加します。tee
結果を書き、tmpfile1
データを2番目のawk
プログラムに渡します。
2番目はawk
新しい6番目の列を要約します。 lineに達すると、Ti
ファイルの最初の行でない限り、現在の合計を印刷して変数をリセットしますsum
。最後の行セットの合計がEND
ブロックに出力されます。変数はi
各出力の前にインクリメントされ、その列の目的のインデックスです。これでファイルが作成されますtmpfile2
。
tmpfile1
:
Ti 1.9699858320 2.0810775390 4.162155079 5.20200 -0.577899
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976
Pb 4.1621550790 4.1621550790 4.192557641 3.39279 0
O 3.7662066970 4.1621550790 4.192557641 -4.29652 1.7012
Ti 6.1302323500 6.2584338990 4.192557641 5.23841 -0.671572
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
Pb 8.3547127200 8.3547127200 4.196295567 3.40984 0
O 7.9266344100 8.3547127200 4.196295567 -4.36260 1.86753
Ti 10.318243871 10.452860504 4.196295567 5.26652 -0.708961
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
Pb 12.551008287 12.551008287 4.193631562 3.43289 0
O 12.112224767 12.551008287 4.193631562 -4.38552 1.92429
tmpfile2
:
1 3.00125
2 3.08149
3 3.17763
ステップ2: 以下を一緒に貼り付けてください。
paste tmpfile1 tmpfile2
これは生産します
Ti 1.9699858320 2.0810775390 4.162155079 5.20200 -0.577899 1 3.00125
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976 2 3.08149
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976 3 3.17763
Pb 4.1621550790 4.1621550790 4.192557641 3.39279 0
O 3.7662066970 4.1621550790 4.192557641 -4.29652 1.7012
Ti 6.1302323500 6.2584338990 4.192557641 5.23841 -0.671572
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
Pb 8.3547127200 8.3547127200 4.196295567 3.40984 0
O 7.9266344100 8.3547127200 4.196295567 -4.36260 1.86753
Ti 10.318243871 10.452860504 4.196295567 5.26652 -0.708961
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
Pb 12.551008287 12.551008287 4.193631562 3.43289 0
O 12.112224767 12.551008287 4.193631562 -4.38552 1.92429
結果はタブで区切られます。