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