Usando a linha CSV como parâmetros de comando

4

Eu tenho um arquivo CSV como:

Name,Age,Address
Daniel Dvorkin,28,Some Address St. 1234
(... N ...)
Foo Bar,90,Other Address Av. 3210

E eu tenho um comando que usa esses parâmetros:

./mycommand --name="Daniel Dvorkin" --age=28 --address="Some Address St. 1234"

Qual é a maneira mais fácil de executar mycommand para cada linha do CSV?

    
por MZAweb 25.06.2012 / 18:02

3 respostas

7

Isso é muito fácil:

sed '1d;s/\([^,]*\),\([^,]*\),\([^,]*\)/.\/mycommand --name="" --age="" --address=""/e' file.csv

1d excluirá a linha de legenda. O comando s modificará a string como no seu exemplo e no final do comando s executará a string. esta é a extensão GNU, então se você não tem o GNU sed, você pode usar xargs em vez e :

sed '1d;s/\([^,]*\),\([^,]*\),\([^,]*\)/.\/mycommand --name="" --age="" --address=""/' file.csv | xargs
    
por 25.06.2012 / 18:11
5

Se o seu CSV for CSV simples sem mecanismo de aspas (portanto, vírgulas não podem aparecer em um campo), você poderá fazer a análise no shell.

{
  read line  # ignore the header line
  IFS=,
  while read -r name age address; do
    ./mycommand --name="$name" --age="$age" --address="$address"
  done
} <input.csv

Se os campos puderem ser citados, você precisará de um analisador de CSV real. Use Perl, Python, R , Ruby ou outras línguas.

    
por 26.06.2012 / 02:07
1

Além do sed, existe o awk ...

awk -F, 'NR > 1 { system("./mycommand --name=\\"" $1 "\\" --age=" $2 " --address=\\"" $3 "\\"") }' < file.csv
    
por 26.06.2012 / 02:33