2つのファイルをマージした後に列がありません

2つのファイルをマージした後に列がありません

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番目の列の代わりにa2番目の列を保存し、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」値を印刷します。

答え2

以下を信頼できますjoin

join -t\| -j 1 -o 1.2,2.2,2.3,1.3 file2 file1

ここで format( -o) は で定義されるため、FILE.FIELDどの入力ファイルからインポートするフィールドを選択すると、フィールド-t区切り文字を定義し、-j一致するために両方のファイルの共通フィールドを定義するために使用されます。

ソートが必要な場合があります。

join -t\| -j 1 -o 1.2,2.2,2.3,1.3 <(sort file2) <(sort file1)

答え3

awk 'BEGIN{FS=OFS="|"} NR==FNR {a[$1]=$2 OFS $3;next} ($1 in a) {print $2,a[$1],$3}' file1.txt file2.txt > file3.txt

移植性のために、私はBEGIN{FS=OFS="|"}フィールド区切り文字と出力フィールド区切り文字を選択できることから始めました。

次に、最初のファイルにあるときにNR==FNR出力フィールド区切り文字で区切られた2番目と3番目のフィールドを登録し、次の行に達し{a[$1]=$2 OFS $3;next}ましたが、まだ何も印刷されていません。スクリプトは3番目のフィールドを登録しないため、出力できません。

2番目のファイルに到達すると合計NRFNR異なり、最初のフィールドがarrayにあることを確認してください($1 in a)。 2番目のフィールドである配列と3番目のフィールドを登録してから印刷するのではなく、すぐに印刷します{print $2,a[$1],$3}

答え4

2つの入力ファイルのデータを含む区切り文字または区切り文字である改行文字を含むフィールドを含まない「簡単な」CSVレコードであり|、質問のようにファイルが1行ずつ一致すると仮定します。

awkこれら2つのファイルはusingに並んで表示されpasteawk必要な順序で目的のフィールドを選択するために使用できます。

paste -d '|' file1 file2 |
awk -F '|' 'BEGIN { OFS=FS } { print $5, $2, $3, $6 }' >file3

file3質問のデータに関する結果を提供します。

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

関連情報