我有两个文件,它们的行数都相同。文件 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
程序从 中读取一行file2
并将其按空格分割到数组 中a
。的第二个元素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
为了另外避免对第二个文件的名称进行硬编码,请将其名称传递到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