Substitua os dados em uma coluna em um arquivo com os dados em uma linha de outro arquivo

3

Eu sou novo trabalhando com o ambiente linux e preciso escrever um script para processar alguns dados.

Eu tenho um arquivo assim:

Arquivo A:

1    X   1    1.0
2    X   1    1.0
3    X   1    1.0
4    Y   2    1.0
5    Y   2    1.0
6    Z   3    1.0

e outro arquivo que se parece com isso:

Arquivo B:

1 0.5
2 0.3
3 0.2

Eu preciso substituir os números da 4ª coluna do Arquivo A, com os números que aparecem na 2ª coluna do arquivo B, mas tem que corresponder os números da 3ª coluna do arquivo A com os números do arquivo. 1ª coluna do arquivo B

A opção desejada é:

1    X   1    0.5
2    X   1    0.5
3    X   1    0.5
4    Y   2    0.3
5    Y   2    0.3
6    Z   3    0.2
    
por BLopa 30.11.2016 / 05:55

3 respostas

3

Se você não puder classificar os arquivos, use o Awk, que é (como join ) projetado para manipular dados delimitados.

Nesse caso, passe primeiro o segundo arquivo para construir uma tabela de consulta e use a tabela de consulta para modificar cada linha do primeiro arquivo conforme você passa por ele.

$ cat file2
1 0.5
2 0.3
3 0.2
$ cat file1
1    X   1    1.0
2    X   1    1.0
3    X   1    1.0
4    Y   2    1.0
5    Y   2    1.0
6    Z   3    1.0
$ awk 'NR==FNR {a[$1] = $2; next} {$4 = a[$3]} 1' file2 file1
1 X 1 0.5
2 X 1 0.5
3 X 1 0.5
4 Y 2 0.3
5 Y 2 0.3
6 Z 3 0.2
$
    
por 30.11.2016 / 09:43
2

Use join :

join -1 3 -o 1.1,1.2,0,2.2 file1 file2

Saída com arquivos fornecidos:

$ cat file1
1    X   1    1.0
2    X   1    1.0
3    X   1    1.0
4    Y   2    1.0
5    Y   2    1.0
6    Z   3    1.0
$ cat file2
1 0.5
2 0.3
3 0.2
$ join -1 3 -o 1.1,1.2,0,2.2 file1 file2
1 X 1 0.5
2 X 1 0.5
3 X 1 0.5
4 Y 2 0.3
5 Y 2 0.3
6 Z 3 0.2
$ 

Observe que ambos os arquivos de entrada devem ser classificados (para a coluna na qual você deseja se juntar a eles). Essa é uma classificação em lexicográfica necessária, não numérica, portanto, certifique-se de sort -n dos arquivos apropriadamente se houver mais de dez itens. (Você pode recorrer novamente depois de entrar.)

    
por 30.11.2016 / 06:15
1

Se você não puder classificar a entrada, join não funcionará, mas você poderá usar sed . A idéia é usar sed uma vez para transformar o arquivoB em um script e, em seguida, alimentar esse script de volta para sed para transformar o arquivoA.

Então, em uma linha, usando a substituição padrão do comando shell POSIX:

sed -e "$(sed 's:^\([0-9]*\) \(.*\)$:s/  *[^ ]*$/    /:' file2)" file1
    
por 30.11.2016 / 07:29