$ 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
O espaçamento do cabeçalho e da coluna é deixado como um exercício.
Suponha que eu tenha 2 arquivos, ABC.txt & DEF.txt com os dados mostrados abaixo como exemplo:
ABC.txt:
abc 14
dka 1
def 51
DEF.txt:
def 12
ckd 41
Eu quero grep coluna 1 & 2 de ambos os arquivos e gravar em um terceiro arquivo para que o terceiro arquivo contenha o arquivo sem qualquer coluna repetida 1 e o valor thire colocado para dois arquivos e coloque zero para valores que não saíram nos arquivos. Como isso pode ser feito?
Minha saída esperada é (saída:
ABC DEF
abc 14 0
ckd 0 41
def 51 12
dka 1 0
$ 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
O espaçamento do cabeçalho e da coluna é deixado como um exercício.
Awk
solução:
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
A saída:
ABC DEF
abc 14 0
dka 1 0
def 51 12
ckd 0 41
O datamash do GNU tem uma opção de tabulação cruzada (tabela dinâmica) que é muito boa para esse tipo de coisa - embora seus dados precisem de algum pré-processamento:
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