Bash условен цитат в низ

Имам CSV файл, който анализирам в bash, който за една колона има повече от една стойност за някои редове. Например ред с множество стойности може да изглежда така

name,12,120,east,"sw1,sw2,sw3"

Но не всички редове го имат. Някои може да изглеждат като

name,10,141,west,sw5534a

Това, което се опитвам да направя, е ако тази колона има кавички в нея, да ги премахна и да задам променливата само на sw1,sw2,sw3

Съответни части от скрипта:

#!/bin/bash
INPUT=file.csv
OLDIFS=$IFS
IFS=,
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read name building id region parents
do
echo "
....snip....
parents $parents"

Изходът, който искам за $parents, трябва да бъде sw1,sw2,sw3, но в момента той изплюва като "sw1,sw2,sw3" Опитах се да се забъркам със съвпадение на регулярен израз в условно, ако колоната има запетая, за да премахна първия и последните два знака, но не можах накарайте го да работи. Или ще премахне първото s и последното 3, или просто ще излезе грешка.

Всички предложения се оценяват!


person Ross    schedule 02.01.2015    source източник
comment
не можете ли просто да направите: sed 's///g' file.csv   -  person Kevin    schedule 02.01.2015
comment
Могат ли други полета във файла да бъдат цитирани по този начин?   -  person Barmar    schedule 02.01.2015
comment
@Barmar: Не съм съгласен с маркирането на този въпрос като дубликат. Другият въпрос е за awk, а не за bash.   -  person Steve Vinoski    schedule 02.01.2015
comment
Става въпрос за използването на awk за анализиране на CSV файл в bash скрипт. Не мисля, че можете да направите това правилно само с bash.   -  person Barmar    schedule 02.01.2015
comment
Страничен проблем: можете да зададете IFS локално за оператора read. Това избягва да се налага да го записвате и възстановявате и също така избягва всякакви взаимодействия, които може да има в тялото на цикъла while: while IFS=, read name building id region parents. Освен това на практика винаги искате да предоставите флага -r на read.   -  person rici    schedule 02.01.2015


Отговори (2)


Можете да премахнете и двете екземпляри на знака " в променливата $parents със замяна на подниз:

echo ${parents//\"/}

Това замества всички " знака с празния низ.

person Steve Vinoski    schedule 02.01.2015
comment
Как помага това? Идеята е да се третира това като едно поле, защото е цитирано. - person Barmar; 02.01.2015
comment
Работи страхотно! Благодаря купища! (Няма да ми позволи да приема отговора ви още 3 минути, но в този момент ще го направя) - person Ross; 02.01.2015
comment
@Barmar: прочетете въпроса. Той иска символите с двойни кавички в стойността на полето да бъдат премахнати с помощта на bash конструкции. Моят код прави точно това. - person Steve Vinoski; 02.01.2015
comment
Съжалявам, прочетох погрешно, мислех, че ги премахвате от реда, преди да го прочетете. - person Barmar; 02.01.2015
comment
Въпреки че, ако има други полета в CSV, които имат запетаи в тях, изразът read ще постави грешните полета в parents. - person Barmar; 02.01.2015
comment
И както винаги, ако низът съдържа серии от празни интервали или заместващи символи на обвивката, ако не го цитирате правилно, това ще се провали. Искате echo "${parents//\"/}" с двойни кавички и по принцип винаги използвайте двойни кавички освен ако не знаете какво искате правят. - person tripleee; 02.01.2015

parents="${parents#\"}"
parents="${parents%\"}"

Това ще премахне първия знак, ако е цитат, и последния знак, ако е цитат. Ако не са цитат, ще останат недокоснати.

person Amadan    schedule 02.01.2015
comment
Хубаво, но се изисква екраниране за в рамките на { }. - person Arjun Mathew Dan; 02.01.2015