awkを使用して2番目のファイルに基づいてファイルを編集する

awkを使用して2番目のファイルに基づいてファイルを編集する

こんにちは、一連の数字を含むファイルがありますが、2番目のファイルの最初の列にその数字が表示されるたびに行を編集したいと思います。

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.inpDOSテキストファイルに変換するだけで、あなたが見るものを再現できます。

Windowsテキストエディタを使用してこれらのファイルを編集した場合、またはWindowsシステムで作成した場合は、DOSテキストファイルである可能性が高くなります。

このユーティリティを使用してUnixテキストファイルに変換しますdos2unix

DOSテキストファイルの場合、b.inpコードには最初のブロック値行の末尾にキャリッジリターン文字が含まれますawk。これらのキャリッジリターンは、後で(where from)が決して真にならないようにします$1$1 in lines$1a.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

おすすめ記事