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