Mentre commenti nella tua domanda, awk
è davvero la strada da percorrere. Usare cut
è possibile insieme tr -s
a spremere gli spazi, come mostra la risposta di kev .
Vorrei tuttavia passare attraverso tutte le possibili combinazioni per i futuri lettori. Le spiegazioni sono nella sezione Test.
tr | tagliare
tr -s ' ' < file | cut -d' ' -f4
awk
awk '{print $4}' file
bash
while read -r _ _ _ myfield _
do
echo "forth field: $myfield"
done < file
sed
sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file
test
Dato questo file, testiamo i comandi:
$ 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 | tagliare
$ 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
bash
Questo legge i campi in sequenza. Usando _
indichiamo che questa è una variabile usa e getta come una "variabile spazzatura" per ignorare questi campi. In questo modo, memorizziamo $myfield
come il quarto campo nel file, indipendentemente dagli spazi tra loro.
$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4
sed
Questo cattura tre gruppi di spazi e senza spazi ([^ ]*[ ]*){3}
. Quindi, cattura tutto ciò che arriva fino a uno spazio come il quarto campo, con il quale è finalmente stampato \1
.
$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4