ABC.txtとDEF.txtという2つのファイルがあると仮定すると、データは次のようになります。
ABC.txt:
abc 14
dka 1
def 51
DEF.txt:
def 12
ckd 41
両方のファイルで列1と2をgrepし、3番目のファイルに書き込んで、3番目のファイルに列1を重複させずに両方のファイルが含まれるようにしたいと思います。 2 つのファイルと存在しない値に対して、3 番目の値が配置されます。ファイルはゼロとして配置されます。どうすればいいですか?
私の予想される出力は次のとおりです(出力:
ABC DEF
abc 14 0
ckd 0 41
def 51 12
dka 1 0
答え1
$ join -j 1 -a 1 -a 2 -o 0,1.2,2.2 -e 0 <(sort ABC.txt) <(sort DEF.txt)
abc 14 0
ckd 0 41
def 51 12
dka 1 0
タイトルと列の間隔は練習問題として残されます。
答え2
Awk
解決策:
awk 'BEGIN{
OFS="\t"; print "", "ABC", "DEF"
}
NR==FNR{ a[$1]=$2; next }
{
if ($1 in a) { v=a[$1]; delete a[$1] }
$3 = v+0
}1;
END{ for(i in a) print i, 0, a[i] }' DEF.txt ABC.txt
出力:
ABC DEF
abc 14 0
dka 1 0
def 51 12
ckd 0 41
答え3
GNUデータの混合データには少し前処理が必要ですが、この種の操作に適したクロスタブ(ピボットテーブル)オプションがあります。
awk '{print $0, substr(FILENAME,1,length(FILENAME)-4)}' ABC.txt DEF.txt |
datamash -Ws --filler='0' crosstab 1,3 unique 2
ABC DEF
abc 14 0
ckd 0 41
def 51 12
dka 1 0