使用 awk 编辑基于第二个文件的文件

使用 awk 编辑基于第二个文件的文件

您好,我有一个包含一组数字的文件,只要这些数字出现在第二个文件的第一列中,我就想编辑一行。

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

相关内容