file1.txtがあります。
1|2022-09-29|03:15:00
2|2022-09-29|10:50:00
3|2022-09-29|07:15:00
とファイル2.txt:
1|red|info 1
2|blue
3|yellow|info 2
これらのファイルを次のようにfile3.txtにリンクしたいと思います。
red|2022-09-29|03:15:00|info 1
blue|2022-09-29|10:50:00|
yellow|2022-09-29|07:15:00|info 2
だからスクリプトを入力しようとしています。
#!/bin/bash
awk -F'|' 'NR==FNR {a[$1]=$2;next} ($1 in a) {a[$1]=$2"|"a[$1]"|"a[$3]"|"$3; print a[$1]}' file1.txt file2.txt > file3.txt
しかし、私の結果は次のとおりです。
red|2022-09-29||info 1
blue|2022-09-29||
yellow|2022-09-29||info 2
ご覧のとおり、file1.txtの3番目の部分が欠落しており、その理由を理解できません。私が何を間違っているかを指摘してくれたら、本当に感謝します。
ベストアンサー1
答えはとても簡単です。a[$3]
参照に使用する3番目の列file1
。しかし、
- 配列を使用して3番目の列の代わりに
a
2番目の列を保存し、file1
- 最初の列(数字)だけが「キー」として使用されているため、アクセスしようとすると
a["info 1"]
(a[$3]
処理した最初の行で行ったようにfile2
)何も返されません。
次のプログラムがこれを行うことができます。
awk 'BEGIN{FS=OFS="|"} NR==FNR{d[$1]=$2;t[$1]=$3;next} ($1 in d) {print $2,d[$1],t[$1],$3}' file1.txt file2.txt > file3.txt
|
入力と出力のフィールド区切り記号を設定します。
- を処理するときは、最初の列(数字)をキーとして
file1.txt
日付を配列にd
、時間を配列に保存します。t
- 処理中に、
file2.txt
列1に対応する日付と時刻の列2を印刷し、|
出力区切り文字として使用される列3に「info」値を印刷します。