私のファイルには27の列と45000の行があります。
head test_1
0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0
16 20 24 20 20 10 6 28 36 10 26 14 24 24 24 30 24 30 24
2 8 2 4 2 0 0 10 8 2 6 0 6 4 4 6 2 10 2
14 12 22 16 18 10 6 20 28 8 20 14 18 20 20 24 22 20 22
0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 2 0
16 20 24 20 20 10 6 30 36 10 26 14 24 24 24 28 22 30 24
0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
シェルスクリプトを使用して各値を定数(ここでは2)に分割したいと思います。どうすればいいですか?似たようなことを試しましたが、awk -v c=2 '{ print $0/c }' test_1
最初の列だけが印刷されます!
ベストアンサー1
はい、awk -v c=2 '{ print $0/c }' test_1
各行全体を分割しようとするため、最初の列のみが印刷されますc
。行を単一の数値に変換すると、数字以外のすべて、つまり最初のスペースとそれ以降のすべての内容が削除されます。
代わりに列を繰り返す必要があります。
awk -v c=2 '{ for (i = 1; i <= NF; ++i) $i /= c; print }' OFS='\t' test_1
このコードは単に各列の値をそれ自体で割った値を設定し、変更されたc
値を含む行を印刷します。NF
は現在行のフィールド(列)の数であり、$i
列の値になりますi
。最後に、OFS='\t'
出力フィールド区切り記号をタブに設定します。
与えられたデータの結果は次のとおりです。
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
8 10 12 10 10 5 3 14 18 5 13 7 12 12 12 15 12 15 12
1 4 1 2 1 0 0 5 4 1 3 0 3 2 2 3 1 5 1
7 6 11 8 9 5 3 10 14 4 10 7 9 10 10 12 11 10 11
0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0
8 10 12 10 10 5 3 15 18 5 13 7 12 12 12 14 11 15 12
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0