Como substituir texto diferente em uma única linha de um csv?

1

Eu sei que perguntas semelhantes foram feitas, mas eu sou um novato, tendo acabado de escolher o Linux nos últimos meses, e os detalhes da minha pergunta me impediram de adaptar outras soluções para o meu problema.

Desejo substituir strings diferentes em uma única linha por strings correspondentes específicas, indicadas em um arquivo CSV.

Um exemplo: arquivo1:

(((1[&label=1],2[&label=1])[&label=5]),3[&label=2])

arquivo2.csv (duas colunas csv):

1[&label, "1[&tag=2,label"
2[&label, "2[&tag=5,label"
3[&label, "3[&tag=3,label"

Eu gostaria de substituir 1[&label por 1[&tag=2,label (etc ...) no arquivo de linha única, de modo que acabaria com:

(((1[&tag=2,label=1],2[&tag=5,label=1])[&label=5]),3[tag=3,&label=2])

Observe que o csv não contém entradas para [&label entradas sem uma tag individual (o 1[&label ), mas ainda preciso dessas [&label entradas no arquivo de saída final.

    
por mav1234 20.12.2016 / 17:17

1 resposta

0

Aqui está uma maneira de fazer isso usando o Bash:

#!/bin/bash

# read the line to act upon
line=$(head -n 1 $1)

while read substitution
do
    # get the first field, delimited by a comma
    findvar='echo $substitution | cut -d, -f1'
    # remove the quotes and get the second field, delimited by a space
    replacevar='echo $substitution | sed 's/"//g' | cut -d' ' -f2'
    # replace all occurrences of the find variable with the replacement
    line=${line//$findvar/$replacevar}
done < $2

echo $line

Se esse script é chamado

substitute.sh

então você poderia ligar

sh substitute.sh file1 file2.csv

Isso está fazendo várias suposições:

  • Seu CSV está no formato que você descreve. No seu exemplo, os valores na primeira coluna não são citados, mas os valores na segunda coluna são. Além disso, o exemplo inclui um espaço após o delimitador. Você precisaria ajustar o script se o formato CSV real for diferente.
  • Como as substituições do CSV são processadas uma por vez, é possível que uma substituição posterior corresponda a uma substituição feita anteriormente. Isso pode não ser sua intenção.

Por exemplo, se sua linha de entrada for

foo bar baz

E o seu arquivo CSV com substituições é

foo, "bar"
bar, "baz"

Você pode pretender que o resultado seja

bar baz baz

Mas o resultado seria

baz baz baz
    
por 22.12.2016 / 05:36