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
フィールド区切り文字を指定しFS
、OFS
それを出力フィールド区切り文字として使用する必要があります。
awk 'BEGIN { FS=OFS="," }
NR==FNR { saving[$1]=$2; next }
($1 in saving){ print $1, saving[$1], $2 }' file1 file2
答え2
コードには2つの主な問題がありますawk
。
awk
フィールド区切り文字として使用するように指定していません,
。を使用してこれを行うことができます-F ,
。$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)