您好,我有一个包含一组数字的文件,只要这些数字出现在第二个文件的第一列中,我就想编辑一行。
a.inp
; atom type fx fy fz
1 1 1000 1000 1000
5 1 1000 1000 1000
7 1 1000 1000 1000
11 1 1000 1000 1000
12 1 1000 1000 1000
13 1 1000 1000 1000
15 1 1000 1000 1000
17 1 1000 1000 1000
20 1 1000 1000 1000
...
b.inp
5
15
29
48
72
87
...
输出
; atom type fx fy fz
1 1 1000 1000 1000
5 1 100000 100000 100000
7 1 1000 1000 1000
11 1 1000 1000 1000
12 1 1000 1000 1000
13 1 1000 1000 1000
15 1 100000 100000 100000
17 1 1000 1000 1000
20 1 1000 1000 1000
...
我的代码由于某种原因不起作用?
awk 'NR == FNR { lines[$1]; next }
$1 in lines { for (col = 3; col <= NF; ++col) $col *= 100 } 1' b.inp a.inp > new.inp
答案1
b.inp
如果我转换为 DOS 文本文件,我只能重现您所看到的内容。
如果您使用 Windows 文本编辑器编辑了这些文件或在 Windows 系统上生成了它们,那么它们很可能都是 DOS 文本文件。
使用该实用程序将它们转换为 Unix 文本文件dos2unix
。
如果b.inp
是 DOS 文本文件,则代码将在第一个块awk
的值的行末尾包含回车符。$1
这些回车符稍后会导致$1 in lines
(where$1
来自a.inp
) 永远不会为真。
将文件转换为 Unix 文本文件,您的代码会生成
; atom type fx fy fz
1 1 1000 1000 1000
5 1 100000 100000 100000
7 1 1000 1000 1000
11 1 1000 1000 1000
12 1 1000 1000 1000
13 1 1000 1000 1000
15 1 100000 100000 100000
17 1 1000 1000 1000
20 1 1000 1000 1000