cut zakończy się niepowodzeniem w przypadku żądania pola, które nie istnieje. Zamiast zwracać „”, zwróci sam łańcuch. Przykład: echo "aaaa" | wynik cut -f2 to „aaaa”, a nie pusty wynik o zerowej długości.
ajaaskel
@ajaaskel Wydaje się, że dzieje się tak, gdy w danych wejściowych nie znaleziono separatora . I to zachowanie można obecnie zmienić za pomocą opcji --only-delimited.
Samuli Pahaoja
64
Alternatywa
N=3
STRING="one two three four"
arr=($STRING)
echo${arr[N-1]}
Używanie do tego celu tablic bash jest „najlepszym” rozwiązaniem. Nienawidzę używać awk lub sed, ponieważ nie widzę ich zainstalowanych we wszystkich konfiguracjach, zwłaszcza w msys.
Sundar
1
Mimo że echo „nie jest konieczne”, uznałem je za przydatne do zrozumienia, jak używać elementów arr. Dzięki
Chen Li Yong
1
Jeśli ustawiłeś IFS(wewnętrzny separator pól) na „:” lub coś innego zamiast odstępu, zmień to z powrotem, zanim spróbujesz.
Noumenon
1
To powinna być właściwa odpowiedź. Używanie tablic do tego celu jest proste i sprytne.
ajaaskel
31
Za pomocą awk
echo$STRING | awk -v N=$N'{print $N}'
Test
% N=3
% STRING="one two three four"
% echo$STRING | awk -v N=$N'{print $N}'
three
Alternatywa
N=3 STRING="one two three four" arr=($STRING) echo ${arr[N-1]}
źródło
IFS
(wewnętrzny separator pól) na „:” lub coś innego zamiast odstępu, zmień to z powrotem, zanim spróbujesz.Za pomocą
awk
echo $STRING | awk -v N=$N '{print $N}'
Test
% N=3 % STRING="one two three four" % echo $STRING | awk -v N=$N '{print $N}' three
źródło
Plik zawierający wyciągi:
Wynik:
Aby więc wydrukować czwarte słowo tego typu instrukcji:
cat test.txt |awk '{print $4}'
Wynik :
źródło
Bez drogich wideł, bez rur, bez bashizmów:
$ set -- $STRING $ eval echo \${$N} three
Ale uważaj na globbing.
źródło
STRING=(one two three four) echo "${STRING[n]}"
źródło