Substitua os números no arquivo1 pela linha correspondente no arquivo2

0

Eu tenho um arquivo que se parece com isso

Arquivo 1

   3 123456789
   3 00000     
   2 123456789
   2 abcde
   1    
   4 abcdefgh

As linhas na primeira coluna estão correlacionadas com o número da linha de outro arquivo, que é algo como isto:

Arquivo 2

$a&a(md
( l 0 p a$1
=2 3 x5 x4
&a”s?m!a

Eu gostaria de alguma maneira de fundir os arquivos, substituindo os números na primeira coluna do primeiro arquivo com o conteúdo da linha correspondente do segundo arquivo. Então, o arquivo final seria algo como isto:

Resultado

=2 3 x5 x4    123456789
=2 3 x5 x4    00000  
( l 0 p a$1   123456789
( l 0 p a$1   abcde
$a&a(md          
&a”s?m!a      abcdefgh

A formatação não importa muito, desde que eu saiba qual coluna é qual.

Estou usando o Linux.

Qualquer ajuda é muito apreciada.

    
por user146854 17.12.2015 / 11:48

2 respostas

1

Você pode usar awk , construindo uma matriz a partir do arquivo2 indexado por seu número de linha (registro) e, em seguida, fazendo uma pesquisa com base no primeiro campo do arquivo1

$ awk 'NR==FNR {a[FNR]=$0;next} {printf "%s\t%s\n", a[$1], $2}' file2 file1
=2 3 x5 x4  123456789
=2 3 x5 x4  00000
( l 0 p a$1 123456789
( l 0 p a$1 abcde
$a&a(md 
&a”s?m!a    abcdefgh

Essa guia separa as duas partes: você pode separá-las por vírgula, se preferir.

    
por 17.12.2015 / 13:49
1

Você pode usar o comando join para isso. Ele mescla dois arquivos com base em um campo comum. Aqui está um exemplo usando bash (eu quebrei as linhas para legibilidade):

join -t , \
    <(awk '{ print NR","$0; }' file2.txt | sort -k 1b,1 -t ,) \
    <(awk '{ print $1","$2; }' file1.txt | sort -k 1b,1 -t ,) \
    | cut -d , -f 2- \
    | column -t -s ,

Saída:

( l 0 p a$1  123456789
( l 0 p a$1  abcde
=2 3 x5 x4   00000
=2 3 x5 x4   123456789
&a”s?m!a     abcdefgh

Algumas explicações:

  • Para simplificar a maneira como os campos e as colunas são manipulados, o primeiro passo é normalizar o caractere separador. Aqui, , é usado para isso.
  • awk é usado para normalizar o separador file1.txt .
  • Como file2.txt não tem um campo explícito para unir as linhas, awk é usado para adicionar o número da linha a cada linha.
  • Por padrão, join usa o primeiro campo de cada arquivo para unir os arquivos. Portanto, não há necessidade de especificar qual campo deve ser usado. Observe que -t é fornecido indicando que os campos estão separados por , .
  • join espera que os dois arquivos de entrada sejam classificados, portanto sort é usado para garantir que a ordem padrão esperada por join seja usada.
  • <( some_command ) cria pipes nomeados anônimos. Basicamente, nos permite usar saídas de comando como arquivos.
  • cut é usado para remover o campo do número da linha da saída.
  • E por último, column é usado para formatar a saída como uma tabela ( -t ). Para evitar mexer nos dados de file2.txt , , é usado como separador ( -s , ).
por 17.12.2015 / 12:57