Jak komentujesz w swoim pytaniu, awk
jest to naprawdę droga. Używanie cut
jest możliwe razem z tr -s
wyciskaniem spacji, jak pokazuje odpowiedź Kev .
Pozwól mi jednak przejść przez wszystkie możliwe kombinacje dla przyszłych czytelników. Objaśnienia znajdują się w części Test.
tr | skaleczenie
tr -s ' ' < file | cut -d' ' -f4
awk
awk '{print $4}' file
grzmotnąć
while read -r _ _ _ myfield _
do
echo "forth field: $myfield"
done < file
sed
sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file
Testy
Biorąc pod uwagę ten plik, przetestujmy polecenia:
$ cat a
this is line 1 more text
this is line 2 more text
this is line 3 more text
this is line 4 more text
tr | skaleczenie
$ cut -d' ' -f4 a
is
# it does not show what we want!
$ tr -s ' ' < a | cut -d' ' -f4
1
2 # this makes it!
3
4
$
awk
$ awk '{print $4}' a
1
2
3
4
grzmotnąć
To odczytuje pola sekwencyjnie. Używając _
tego, wskazujemy, że jest to zmienna jednorazowa jako „zmienna śmieciowa”, aby zignorować te pola. W ten sposób przechowujemy $myfield
jako czwarte pole w pliku, bez względu na odstępy między nimi.
$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4
sed
Przechwytuje trzy grupy spacji i nie ma spacji z ([^ ]*[ ]*){3}
. Następnie łapie wszystko, co nadchodzi, do spacji jako czwartego pola, na którym jest w końcu drukowane \1
.
$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4