Combinar colunas usando o awk? (Ou outras sugestões)

2

Estou tentando ser um pouco eficaz e preciso de um script ou solução de comando.

Digamos que eu faça um arquivo com duas colunas ou dois arquivos com uma coluna, o que for mais fácil:

AA1 B2        ZZ1 YYY XX1
AA2 B2        ZZ2 YYY XX2
AA3 B3        ZZ3 YYY XX3
AA4 B4        ZZ4 YYY XX4
              ZZ5 YYY XX5
              ZZ6 YYY XX6
              ZZ7 YYY XX7

Existe um número ímpar de entradas. Agora, eu quero fazer um novo arquivo (de preferência com alguma outra entrada também, mas vamos começar aqui) que pega todos os valores na primeira coluna e combina isso com cada valor na segunda coluna (eles sempre terão um número desigual de linhas ) e gera resultados como:

AA1 B2 ZZ1 YYY XX1
AA1 B2 ZZ2 YYY XX2
[...]
AA4 B4 ZZ1 YYY XX1
AA4 B4 ZZ2 YYY XX2

Então, percorra todos os valores na coluna 1 em ordem, combinando-os com cada valor na coluna 2 na ordem.

    
por gusgrave 20.11.2015 / 14:12

2 respostas

1

Supondo que você tenha os seguintes arquivos:

$ cat file1
ZZ1 YYY XX1
ZZ2 YYY XX2
ZZ3 YYY XX3
ZZ4 YYY XX4
ZZ5 YYY XX5
ZZ6 YYY XX6
ZZ7 YYY XX7
$ cat file2
AA1 B2
AA2 B2
AA3 B3
AA4 B4

Em seguida, use este awk :

awk 'FNR==NR{a[c++]=$0} FNR!=NR{for(i in a){print $0,a[i]}}' file1 file2
  • FNR==NR aplica-se apenas ao primeiro arquivo file1
    • a[c++]=$0 preenche uma matriz chamada a com o conteúdo de file1
  • FNR!=NR aplica-se apenas ao segundo arquivo file2
    • for(i in a) faz um loop no array a ...
    • print $0,a[i] ... e imprima a linha de file2 e o conteúdo da matriz.

O outout:

AA1 B2 ZZ1 YYY XX1
AA1 B2 ZZ2 YYY XX2
AA1 B2 ZZ3 YYY XX3
AA1 B2 ZZ4 YYY XX4
AA1 B2 ZZ5 YYY XX5
AA1 B2 ZZ6 YYY XX6
AA1 B2 ZZ7 YYY XX7
AA2 B2 ZZ1 YYY XX1
AA2 B2 ZZ2 YYY XX2
AA2 B2 ZZ3 YYY XX3
AA2 B2 ZZ4 YYY XX4
AA2 B2 ZZ5 YYY XX5
AA2 B2 ZZ6 YYY XX6
AA2 B2 ZZ7 YYY XX7
AA3 B3 ZZ1 YYY XX1
AA3 B3 ZZ2 YYY XX2
AA3 B3 ZZ3 YYY XX3
AA3 B3 ZZ4 YYY XX4
AA3 B3 ZZ5 YYY XX5
AA3 B3 ZZ6 YYY XX6
AA3 B3 ZZ7 YYY XX7
AA4 B4 ZZ1 YYY XX1
AA4 B4 ZZ2 YYY XX2
AA4 B4 ZZ3 YYY XX3
AA4 B4 ZZ4 YYY XX4
AA4 B4 ZZ5 YYY XX5
AA4 B4 ZZ6 YYY XX6
AA4 B4 ZZ7 YYY XX7
por 20.11.2015 / 14:35
0

Como seus valores têm espaços, seria mais fácil ter as duas colunas em arquivos separados. Então você poderia fazer algo como:

IFS='
'
for a in $(cat file1); do
  for b in $(cat file2); do
     echo "$a $b" > file3;
  done
done

Não é o mais eficiente, pois tem que ler no arquivo2 em sua totalidade para cada linha no arquivo1, mas ele faria o trabalho.

    
por 20.11.2015 / 14:28

Tags