回答:
結合の使用:
join -1 1 -2 2 -a1 -e0 -o'0,1.2,2.1' file2 file1
joinコマンドは、データの共通フィールドを共有する2つのファイルの行を結合します。この場合:file2のフィールド1(-1 1
)と-2 2
file1のフィールド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
。
-e0
perlは必要ありません:)