回答:
結合の使用:
join -1 1 -2 2 -a1 -e0 -o'0,1.2,2.1' file2 file1
joinコマンドは、データの共通フィールドを共有する2つのファイルの行を結合します。この場合:file2のフィールド1(-1 1)と-2 2file1のフィールド2()を使用して、file2とfile1を結合します。
出力は次のようになります: "結合されたフィールド、file2のフィールド2、file1のフィールド1"(-o'0,1.2,2.1')、欠落しているフィールドがある場合は0(-e0)
2つのファイルの1つにさらにレコードがある場合は、それらを追加します(この場合はfile2)(-a1)
コマンドjoinのマンページを参照してください
少しawk魔法:
awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0}; \
printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}' \
file1 file2
または
awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0};
print $1,$2,a[$1]}' file1 file2
出力
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0
説明
FNR==NR{a[$2]=$1;next}
file1(FNR==NR)を実行し、Key-Value構造を作成します。キーはの2列目($2)でfile1、値はの1列目($1)ですfile1
{if(a[$1]==""){a[$1]=0};print $1,$2,a[$1]}
を実行しfile2、
if(a[$1]==""){a[$1]=0}
の最初の列($1)のキーがにfile2存在しない場合はfile1、0
print $1,$2,a[$1]
printの最初と2番目の列、file2および最初の列($1)のキーを持つKey-Value構造の値を(を使用して)印刷しますfile2
または
printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}'
printfの第1列と第2列、file2および第1列($1)のキーを持つキーと値の構造の値を(を使用して)印刷しfile2ます。
FS 入力ファイルから取得した列間のセパレーター
"%s%s%s%s%s\n"
出力のフォーマットです
%s - ストリング
\n –改行
qの使用:
$ q "select f2.c1, f2.c2, ifnull(f1.c1,0) from file_2.txt f2 LEFT JOIN file_1.txt f1 on f1.c2 = f2.c1 "
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0
この方法は時々読みやすいかもしれません。
qに、パッケージpython3-q-text-as-data(Python 3)とパッケージpython-q-text-as-data(Python 2)にあります。
qパッケージはどこで手に入りますか?python-q-text-as-dataまたはをインストールできないようですpython3-q-text-as-data。「E:パッケージpython3-q-text-as-dataが見つかりません」。私のシステムがすでにインストールされているpython、python2.7、python3、とpython3.4。
-e0perlは必要ありません:)