Mesclando colunas de dois arquivos separados

8

Como criar um novo arquivo mesclando colunas seletivas de dois arquivos separados usando o awk? Sem bagunçar as ordens de elementos de ambos os arquivos.

Exemplo: o arquivo 3 pode conter a coluna 1,2,3 do arquivo 1 e a coluna 4 do arquivo 2.

File 1
A   23  8   T
A   63  9   9
B   45  3   J

File 2
A   0
A   6   
B   5

File 3
A   23  8   0
A   63  9   6
B   45  3   5
    
por dovah 21.07.2014 / 09:55

2 respostas

4

Tente isto:

$ awk 'FNR==NR{a[FNR]=$2;next};{$NF=a[FNR]};1' file2 file1
A 23 8 0
A 63 9 6
B 45 3 5
    
por 21.07.2014 / 10:00
15

Existe uma ferramenta dedicada para isso: paste . Ele concatena cada linha completa do primeiro arquivo com a linha correspondente do segundo arquivo; Você pode remover colunas indesejadas antes ou depois. Por exemplo, supondo que suas colunas sejam delimitadas por tabulações:

paste file1.txt file2.txt | cut -f 1,2,3,6

Aqui está uma maneira de pré-filtrar os dois arquivos que dependem da substituição do processo ksh / bash / zsh.

paste <(<file1.txt sed 's/[[:space:]][[:space:]]*[^[:space:]]*$//') \
      <(<file1.txt sed 's/^[^[:space:]]*[[:space:]][[:space:]]*//')

O Awk é voltado principalmente para o processamento de um arquivo por vez, mas você pode chamar getline para ler outro arquivo em paralelo.

awk '
  BEGIN {file2=ARGV[2]; ARGV[2]="";}
  {$0 = $0 ORS getline(); print $1, $2, $3, $6;}
' file1.txt file2.txt

Até agora eu assumi que você deseja corresponder a linha 1 do arquivo 1 com a linha 1 do arquivo 2, a linha 2 do arquivo 1 com a linha 2 do arquivo 2, etc. Se você deseja corresponder ao conteúdo de uma coluna , isso é um assunto completamente diferente. join fará o trabalho desde que a coluna que você deseja combinar esteja classificada.

    
por 22.07.2014 / 01:53