あるファイルの列に別のファイルの同じ行の数値を掛ける方法は?

あるファイルの列に別のファイルの同じ行の数値を掛ける方法は?

2つのファイルがあり、どちらも同じ行数を持っています。ファイル1には16個の列があり、ファイル2には2個の列があります。

ファイル1

1 2 3 4...
2 3 4 5...
3 4 5 6...

ファイル2

text 10
text 11
text 12

これで、次の出力を含む別のファイルが必要です。

10 20 30 40...
22 33 44 55...
36 48 60 72...

awkを試してみましたが、成功しませんでした。

ベストアンサー1

$ awk '{ getline line <"file2"; split(line,a); for (i=1; i<=NF; ++i) $i *= a[2] };1' file1
10 20 30 40
22 33 44 55
36 48 60 72

file1コマンドラインに与えられた各行に対して、プログラムはawkその行から1行を読み取り、file2スペースで分割して配列にしますa。の2番目の要素は、a現在のレコード(からfile1)の各フィールドを乗算するために使用されます。ループが終了すると、後続1結果修正レコードが出力されます。

テキストにfile2スペースが含まれている場合は常についに使用するファイルのフィールドを確認し、line文字列がいくつのフィールドに分割されているかを追跡します。

$ awk '{ getline line <"file2"; nf=split(line,a); for (i=1; i<=NF; ++i) $i *= a[nf] };1' file1
10 20 30 40
22 33 44 55
36 48 60 72

2番目のファイルの名前をハードコードしたくない場合は、その名前をawkコマンドラインの変数に渡してください。

$ awk -v other=file2 '{ getline line <other; nf=split(line,a); for (i=1; i<=NF; ++i) $i *= a[nf] };1' file1
10 20 30 40
22 33 44 55
36 48 60 72

...またはその名前を環境変数に渡します。

$ other=file2 awk '{ getline line <ENVIRON["other"]; nf=split(line,a); for (i=1; i<=NF; ++i) $i *= a[nf] };1' file1
10 20 30 40
22 33 44 55
36 48 60 72

おすすめ記事