Mesclando colunas de dois arquivos separados

10

Como criar um novo arquivo mesclando colunas seletivas de dois arquivos separados usando o awk? Sem bagunçar as ordens dos elementos dos dois 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
dovah
fonte

Respostas:

4

Tente o seguinte:

$ 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
cuonglm
fonte
Obrigado! Eu também tentei com sucesso este caminho para sair usando gawk:pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
dovah
2
@Dovah: Você pode usar paste file1 file2e imprimir os campos selecionados em awk.
cuonglm
Isso armazena file2na memória, o que pode ser proibitivo se os arquivos forem grandes. Existe uma maneira mais simples de fazer isso sem sobrecarga de memória (veja minha resposta).
Gilles 'SO- stop be evil'
17

Há uma ferramenta dedicada para que: paste. 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ção:

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

Aqui está uma maneira de pré-filtrar os dois arquivos que se baseiam na 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 ligar getlinepara ler de 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, assumi que você deseja combinar 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 combinar o conteúdo de uma coluna, é uma questão completamente diferente. joinfará o trabalho desde que a coluna que você deseja corresponder esteja classificada.

Gilles 'SO- parar de ser mau'
fonte