Como encontrar uma string no fileA, selecionar algum texto dessa string e substituir uma string no fileB?

2

Eu tenho um arquivo A e um arquivo B. Em fileA , quero que meu script encontre uma stringA específica; em seguida, com o comando sed , cole apenas uma parte da stringA em um arquivo B (substituindo por parte de uma stringB específica em fileB ).

Por exemplo.

fileA
ashdjkahsjd
asjkdhajsdh
Recommended Weight: 0.546 (this is the string of interest)

fileB
asdajskdha
kjashdjahsd
WGHT      0.495 (this is the part of FILE B I need to replace)

Eu quero selecionar apenas o texto de stringA (0,546) e substituir 0,495 no arquivoB por 0,546, portanto, o novo arquivoB será:

NEW fileB
asdajskdha
kjashdjahsd
WGHT      0.546

Usar apenas sed não funciona para mim porque substitui uma stringA por uma stringB no mesmo arquivo, mas minhas stringsA e B são de arquivos diferentes. Além disso, eles são gerados "aleatoriamente" (por meio de um programa).

    
por Raymundo Picos 11.08.2017 / 19:52

4 respostas

5

Você pode realmente fazer isso com sed (e outra ferramenta para corresponder ao primeiro arquivo). Por exemplo:

$ sed -E "s/(WGHT\s*).*/$(grep -oP 'Recommended Weight: \K[0-9.]+' fileA)/" fileB 
asdajskdha
kjashdjahsd
WGHT 0.546

Ou apenas salve-o em uma variável primeiro:

$ wght=$(sed -En 's/Recommended Weight: *([0-9.]+)//p' fileA)
$ sed -E "s/(WGHT\s*).*/$wght/" fileB
asdajskdha
kjashdjahsd
WGHT 0.546 
    
por 11.08.2017 / 20:21
4
awk 'FNR==NR && $2 == "Weight:"{ weights[spotted++]=$3} FNR!=NR && $1 != "WGHT" { print } FNR!=NR && $1=="WGHT" { print "WGHT", weights[replaced++]} ' in1 in2 > out2

Isso criará um novo arquivo, out2 , que possui os dados de saída desejados. Ele pode então ser movido para onde você quiser.

$ cat out2
asdajskdha
kjashdjahsd
WGHT 0.546
    
por 11.08.2017 / 20:17
3

Este script cria new_file_b.txt .

Uso: ./script.sh file_a.txt file_b.txt > new_file_b.txt

#!/bin/bash

awk '
/Recommended Weight: /{
    value=$3;
}
NR != FNR {
    if($1 == "WGHT") {
        print $1 OFS value; 
    } else {
        print;
    }
}
' "$1" "$2"
    
por 11.08.2017 / 20:32
0

Com GNU sed , você pode fazer da seguinte maneira:

sed -Ez '
   N;s/.*\nRecommended Weight: (\S+)\n.*\x00(.*\nWGHT[[:blank:]]+)\S+\n/\n/
' fileA fileB

Onde a opção -E ativa a opção extended regex facility e -z , cada arquivo é tratado como uma única cadeia de caracteres e vários arquivos são nulos ( %code% ) separados.

    
por 14.08.2017 / 07:53