2つの別々のファイルのフィールドを一致させるために{BEGIN FS = "|"}を含むawkコマンドを使用すると、空の出力行が返されます。

2つの別々のファイルのフィールドを一致させるために{BEGIN FS = "|"}を含むawkコマンドを使用すると、空の出力行が返されます。

2ファイル:data1

    Name       |formula           |no. |dose|days|cost  |msg|em|notes
    Fname-Lname|BXXXT+GG          |8262|4   |14  |57.78 |   |  |sq
    Fname-Lname|SJXXT+GG          |8263|4¾  |14  |105.15|   |  |IB
    Fname-Lname|FJDHT+BH,LG,CQC,ZX|8264|5¾  |14  |46.20 |   |  |IB

データ2

10/12/2020|more-data-3456|105.15
10/12/2020|more-data-3456|95.10
11/12/2020|more.data-3456|30.30
14/12/2020|more-data-3456|45.55

コードスニペットを使用しています

awk 'BEGIN {FS = "|" } NR==FNR{a[$6];next} $3 in a {print $0}' data1 data2

ファイルdata1の$ 6と一致する値は、ファイルdata2の$ 3の場所にも表示されます。一致するものがあれば、ファイルdata2($ 0)に一致が含まれているレコード全体を印刷します。私は期待する:

10/12/2020|more-data-3456|105.15

ただし、空行のみが出力されます。"|"置換コマンドを使用してファイル区切り文字を削除しましたが、コマンドコードは期待どおりに正しく機能しますが、フィールド区切り文字をできるだけ維持したいと思います" "|BEGINブロックを追加すると、この問題が発生する理由を知りたいです。 awkはS6からデータを取得するのではなく空の配列をロードしますか?私のawkレベルは初心者レベルより少し高いです。編集:また、-Fパラメーターを使用して空白行を出力するのと同じ結果を得ました。私はゴークを使用しています。

答え1

  1. DOS行の終わりがあるかもしれません。私のツール出力がそれ自体で上書きされる理由と回避策そのため、存在する場合は削除してください(以下のスクリプトから対応するスペースやその他の末尾のスペースを削除しますsub())。
  2. 空白行の出力を取得する場合は、各入力ファイルに空白行があります。ただし、実際には空行出力を取得するのではなく、代わりに取得する必要がある1行の出力を取得しますが、上書きで終わります105.15CR後線の開始 - 出力をパイプして、| cat -vこれが真であることを確認します。
  3. 入力にはいくつかの場所でsの前後にスペースがあるので、一致するように|設定する必要があります。FSFS=" *[|] *"
  4. {print $0}これがデフォルトの動作なので、作成する必要はありません。

この試み:

awk 'BEGIN{FS=" *[|] *"} {sub(/[[:space:]]+$/,"")} NR==FNR{a[$6];next} $3 in a' data1 data2

答え2

あなたのコードはGNU awk 5.1.0とmacOS awk 20200816の両方で動作します。

どのバージョンのawkを使用していますか?

コマンドライン引数を使用してフィールド区切り文字を設定することもできます-F。これにより、このBEGINブロックは必要ありません。

関連情報