Comando Awk para mesclar arquivos

0

Eu preciso de um comando awk para mesclar esses dois arquivos que possuem valores correspondentes.

Color:Green
Color:Yellow 
Color:Orange

e

Green:Yes
Orange:Yes

E obtenha

 Color:Green:Yes
 Color:Orange:Yes
    
por John Wick 13.12.2017 / 15:45

3 respostas

2

Usando join e sort em bash :

$ join -t: -1 2  <( sort -t: -k2 colours.txt ) <( sort selected.txt )
Green:Color:Yes
Orange:Color:Yes

Para ordenação correta dos campos:

$ join -t: -1 2 -o1.1,1.2,2.2 <( sort -t: -k2 colours.txt ) <( sort selected.txt )
Color:Green:Yes
Color:Orange:Yes

join executa uma operação JOIN relacional nos dados de entrada classificados. Nesse caso, o campo de junção é a cor, que aparece como o segundo campo : -delimited no primeiro arquivo e como o primeiro campo : -delimited no segundo arquivo.

Com join -t: -1 2 , fazemos com que join escolha o segundo campo do primeiro arquivo como o campo "unir chave" (o primeiro campo é o padrão) e com os dois <(...) (substituições de processo em bash ) nós fornecemos os dados classificados. O primeiro sort é o único que é "especial", pois classifica o primeiro arquivo em seu segundo campo : -delimited, a cor.

O segundo exemplo acima usa o sinalizador -o para especificar explicitamente o que gostaríamos de ver na saída e em qual ordem.

    
por 14.12.2017 / 13:18
0

Aqui está uma solução awk :

awk -F':' 'NR==FNR{seen[$1]=$2; next} 
    ($2 in seen){print $0":"seen[$2]; next}1' file2  file1

Entradas:

==> file1 <==
Color:Green
Color:Yellow
Color:Pinky
Color:Orange

==> file2 <==
Green:Yes
Orange:Yes
Yellow:No

Saída:

Color:Green:Yes
Color:Yellow:No
Color:Pinky
Color:Orange:Yes
    
por 14.12.2017 / 11:50
0

Assumindo que arquivo1 é

color:green
color:yellow
color:orange

e o arquivo2 é

green:yes
orange:yes

Acho que isso gerará o que você deseja:

awk -F ':' 'FNR==NR{a[$1]=$2;next}($2 in a){print a[$1]":"a[$2]} file2 file1

OUTPUT:

color:green:yes
color:orange:yes
    
por 14.12.2017 / 19:04