Anexar as colunas mth e nth de um arquivo com as colunas de outro arquivo

1

Eu tenho 2 arquivos com diferentes números de colunas e com um grande número de linhas:

bash-3.00$ cat fileA 
a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................
z,p,,,,w,e,,

PS1: a1 - a9 são os cabeçalhos separados por vírgula (,). PS2: sinais de pontos (.) Significa que existem muitas linhas entre as duas linhas

bash-3.00$ cat fileB 
b1      b2
f       t
a       p
m       n
..........      
m       y
t       o

PS: b1 - b2 são os cabeçalhos e separados por espaço.

Eu quero acrescentar as colunas a2 e a6 do arquivo A ao conteúdo das colunas b1 e b2. Ou seja, uma coluna a2 será anexada à coluna b1; coluna a6 será anexada à coluna b2.

Então, o arquivo de saída seria o seguinte:

bash-3.00$ cat output 
a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................       
z,p,,,,w,e,,
,f,,,,t,,,
,a,,,,p,,,
,m,,,,n,,,
.........................
,m,,,,y,,,
,t,,,,o,,,

Como posso fazer isso com um simples comando do awk?

    
por Murat 31.07.2015 / 15:29

2 respostas

1

Parece que o que você quer é i) anexar o conteúdo do arquivo1 ao arquivo2 e ii) alterar o formato do arquivo2 para que corresponda ao arquivo um. Não é isso que a sua pergunta está realmente pedindo, mas é o que você mostra na sua saída. Se eu entendi errado, edite sua pergunta e esclareça.

Então, para fazer isso, você pode simplesmente fazer:

awk 'NR>1{printf ",%s,,,,%s,,,\n",$1,$2}' file2 >> file1 

Isso fará com file1 o arquivo de saída. Se você quiser manter file1 , você poderia fazer:

( cat file1; awk 'NR>1{printf ",%s,,,,%s,,,\n",$1,$2}' file2 ) > out

Ou você poderia fazer tudo em awk (esta é apenas uma versão simplificada da solução do Archemar):

awk 'NR==FNR{print; next} FNR>1{printf ",%s,,,,%s,,,\n",$1,$2}' file1 file2 > out
    
por 31.07.2015 / 16:16
1

tente

awk 'FNR == NR { print ; next ; } 
     NR > FNR && FNR > 1 { 
          split($0,A) ; 
          printf ",%s,,,,%s,,,\n",A[1],A[2] ;  }' f1 f2 

(pode estar em uma linha, eu quebro para ser mais legível)

onde

  • FNR == NR { print ; next ; } copia linhas do primeiro arquivo
  • NR > FNR && FNR > 1 seleciona linha do segundo arquivo sem cabeçalho
  • split($0,A) ; coloca dois var em uma matriz ( A )
  • printf ",%s,,,,%s,,,\n",A[1],A[2] ; e imprima

editar

testado com f1

a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................
z,p,,,,w,e,,

e f2

b1  b2
f   t
a   p
m   n
m   y
t   o

executar:

awk 'FNR == NR { print ; next ; } NR > FNR && FNR> 1 { split($0,A) ; printf ",%s,,,,%s,,,\n",A[1],A[2] ;  }' f1 f2

resultado:

a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................
z,p,,,,w,e,,
,f,,,,t,,,
,a,,,,p,,,
,m,,,,n,,,
,m,,,,y,,,
,t,,,,o,,,
    
por 31.07.2015 / 15:46