Pracuję nad długim scenariuszem Bash. Chcę odczytać komórki z pliku CSV do zmiennych Bash. Mogę analizować wiersze i pierwszą kolumnę, ale nie mogę analizować żadnej innej kolumny. Oto mój dotychczasowy kod:
cat myfile.csv|while read line
do
read -d, col1 col2 < <(echo $line)
echo "I got:$col1|$col2"
done
Drukuje tylko pierwszą kolumnę. Jako dodatkowy test wypróbowałem następujące:
read -d, x y < <(echo a,b,)
A $ y jest puste. Więc spróbowałem:
read x y < <(echo a b)
A $ y jest b
. Czemu?
awk
użycie$1
,$2
itp?Odpowiedzi:
Musisz użyć
IFS
zamiast-d
:Zauważ, że do ogólnego parsowania CSV powinieneś użyć specjalistycznego narzędzia, które może obsługiwać cytowane pola z wewnętrznymi przecinkami, między innymi problemami, których Bash nie może sobie sam poradzić. Przykładami takich narzędzi są
cvstool
icsvkit
.źródło
command not found
. Tylkoecho
prace.;
:while IFS=";" read col1 col2; do ...
${var}
), Ale pomijam je, gdy nie są potrzebne. Dla mnie wygląda czyściej.Ze
man
strony:Używasz,
-d,
który zakończy linię wejściową przecinkiem. Nie odczyta reszty wiersza. Dlatego $ y jest pusty.źródło
Możemy analizować pliki csv z ciągami znaków w cudzysłowach i rozdzielonymi powiedzmy | z następującym kodem
awk przetwarza pola łańcuchowe na zmienne i tr usuwa cudzysłów.
Nieco wolniej, ponieważ awk jest wykonywany dla każdego pola.
źródło
Jeśli chcesz przeczytać plik CSV z kilkoma liniami, to jest to rozwiązanie.
źródło