共通列を使用した2つのファイルのマージ

共通列を使用した2つのファイルのマージ

2つのファイルがあります。

ファイル1は次のようになります。

burnj01,Joe Burns
steves02,Santosh Steve

ファイル2は次のようになります。

burnj01,0001
burnj01,0002
burnj01,0010
burnj,0100
burnj01,2000
steves02,2048
steves02,2049
steves02,2091

私は次のファイル3が欲しい:

burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,0100
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091

最初のファイルのcol1を使用して2つのファイルを結合し、一致する場合は、File2の列2の値をFile1の最後の列に追加したいと思います。

私はこれを試しました:

$ awk 'FNR==NR{a[$1]=$2;next} {print $1,$2,a[$1]}' file2 file1 > file3

しかし、これはうまくいきません。どうやってこれを達成できますか?

答え1

フィールド区切り文字を指定しFSOFSそれを出力フィールド区切り文字として使用する必要があります。

awk 'BEGIN        { FS=OFS="," }
     NR==FNR      { saving[$1]=$2; next }
    ($1 in saving){ print $1, saving[$1], $2 }' file1  file2

答え2

コードには2つの主な問題がありますawk

  1. awkフィールド区切り文字として使用するように指定していません,。を使用してこれを行うことができます-F ,
  2. $1キーが配列にあるかどうかはテストされませんa$1 in a最後のコードブロックより前の条件でこれを実行できます。 2番目のファイルのすべての名前を最初のファイルに表示したいが、これについて何も言わないようにするには、この手順をスキップできます。

また、予想される出力と比較して間違った順序でフィールドを出力しているように見え、カンマ(OFS = ","またはこの問題を解決する必要があるOFS = FSブロック)の代わりに空白のデフォルトの出力区切り文字を使用しています。BEGIN

$ awk -F , 'BEGIN { OFS = FS } FNR == NR { names[$1] = $2; next } ($1 in names) { print $1, names[$1], $2 }' file1 file2
burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091

$ join -t, <( sort file1 ) <( sort file2 )
burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091

これにより、両方のファイルがソートされ、ソートされたコンテンツがユーティリティjoinに渡されます。このjoinユーティリティは、デフォルトでは、最初の列の2つのデータセット間でリレーショナルJOIN操作を実行します。これはINNER JOIN、SQLに慣れている場合はデフォルトでJOINです。列がカンマで区切られていることを知らせるために-t ,withを使用します。join

シェルが<( ... )プロセス置換を理解していない場合は、データを事前に並べ替えます。このjoinユーティリティにはソートされた入力が必要です。

sort -o file1.sorted file1
sort file2 | join -t, file1.sorted -
rm -f file1.sorted

答え3

登録方法は次のとおりです。

join -t, <(sort file1) <(sort file2)

関連情報