Mam podzielony plik tekstowy:
field1,field2,field3
xield1,xield2,xield3
dield1,dield2,dield3
gield1,gield2,gield3
Każda z tych kolumn będzie parametrem programu i chciałbym, aby program był wywoływany dla każdej linii
Miałem nadzieję na pętlę, coś w stylu:
for $i in file
command $field2 -x $field3 -PN -$field1 >> output
done
Jaki byłby najlepszy sposób na osiągnięcie czegoś takiego w bash?
bash
text-processing
scripting
csv
Dziekan
źródło
źródło
Odpowiedzi:
Powinno to działać, jeśli liczba pól jest stała. Zamiast
echo
używać polecenia.źródło
Powinieneś używać
while
zread
wbudowanym:Jak to działa
cut
Oświadczenie zajmuje linię i dzieli go na wskazany przez ogranicznik-d
.--output-delimiter
to znak separatora, którycut
będzie używany do wyświetlania wybranych pól, tutaj wybieramy spację, abyśmy mogli umieścić różne pola w tablicyfields
.-f1-
wchodzi w grę.fields
, możesz uzyskać dostęp do dowolnego pola, którego chcesz, dzięki składni,${field[number]}
gdzienumber
jest o jeden mniej niż rzeczywista liczba pól, którą chcesz, ponieważ indeksowanie tablic w Bash jest zerowane.Uwaga
Dla stałej liczby pól
Zamiast tego możesz zrobić coś podobnego do odpowiedzi 1_CR :
Powyższe, choć wydaje się bardziej hałaśliwe, powinno działać w dowolnej powłoce zgodnej z POSIX, nie tylko w Bash.
źródło
IFS
odpowiednią wartość wread
wywołaniuMożesz
read
podzielić każdą linię na tablicę,
, ustawiającIFS
odpowiednio.W powyższym przykładzie możesz uzyskać dostęp do każdego elementu tablicy za pomocą jego indeksu, zaczynając od 0.
źródło
Ten
awk
liniowiec zrobi, co chcesz:Zastąp
echo
poleceniem if.txt
plikiem, który chcesz iterować.Krótkie wyjaśnienie:
-F,
ustawi się,
jako separator.cmd
buduje polecenie isystem(cmd)
wywołuje polecenie.źródło
gnu sed może być również używany.
zauważ użycie opcji e do polecenia s
źródło