Substitua as palavras no arquivo 2, obtendo a lista de substituições do arquivo 1

4

Cat File 1

ABC,23
DFG,45
Ghj,678

Cat File2

Listed LinkedIn yellow ABC
Fixed DFG linked ABC
Holiday Europe Ghj DFG

Eu preciso da saída como abaixo

Listed LinkedIn yellow 23
Fixed 45 linked 23
Holiday Europe 678 45
    
por canonical 04.09.2015 / 16:46

3 respostas

2

Você pode fazer isso usando bash arrays associativos.

$ cat foo.txt  # Contents of "foo.txt"
ABC,23
DFG,45
Ghj,678

$ cat bar.txt  # Contents of "bar.txt"
Listed LinkedIn yellow ABC
Fixed DFG linked ABC
Holiday Europe Ghj DFG

$ declare -A foobar  # Declaring associative array "foobar"

## Putting comma separated portions of file "foo.txt" as key-value 
## pair for array "foobar"
$ while IFS=',' read a b; do foobar["$a"]="$b"; done <foo.txt 


## Now reading each line of "bar.txt" and iterating over the keys 
## of array "foobar" by "${!foobar[@]}" to find a match, if found
## correspoding value of the key will replace the key using parameter
## expansion pattern "${line//key/value}"

$ while IFS=' ' read line; do for i in "${!foobar[@]}"; do \
    line="${line//"$i"/"${foobar["$i"]}"}"; done; echo "$line"; done <bar.txt 

Listed LinkedIn yellow 23
Fixed 45 linked 23
Holiday Europe 678 45

Aqui está a versão expandida da última parte:

while IFS=' ' read line; do 
    for i in "${!foobar[@]}"; do 
        line="${line//"$i"/"${foobar["$i"]}"}" 
    done 
    echo "$line" 
done <bar.txt
    
por heemayl 04.09.2015 / 22:18
3

Transforme file1 em comandos para sed e use-os para modificar file2 :

sed -r 's/(.*),(.*)/s,,,/' file1 | sed -f - file2

Isso pressupõe que os valores em file1 não contêm caracteres especiais e você deseja substituir todas as ocorrências em file2 .

    
por Florian Diesch 04.09.2015 / 18:07
1

Você pode usar awk

awk 'FS="," {\
    if(NR == FNR) {\
        n[(FNR"")] = $0\
    } else {\
        a[($1)] = $2\
    }\
}\
END {\
    for (i in n) {\
        for (j in a) {\
            gsub(j,a[j],n[i])\
        }\
        print n[i]\
    }\
}' File2 File1

Exemplo

Os arquivos de entrada

cat foo

ABC,23
DFG,45
Ghj,678

cat bar

Listed LinkedIn yellow ABC
Fixed DFG linked ABC
Holiday Europe Ghj DFG

O comando e a saída

% awk 'FS="," { if(NR == FNR) {n[(FNR"")] = $0} else {a[($1)] = $2}}  END {for (i in n) {for (j in a) {gsub(j,a[j],n[i])} print n[i]}}' bar foo
Listed LinkedIn yellow 23
Fixed 45 linked 23
Holiday Europe 678 45
    
por A.B. 04.09.2015 / 18:29