Как вы прокомментируете в своем вопросе, awk
это действительно путь. Использовать cut
можно вместе с тем, tr -s
чтобы сжать пробелы, как показывает ответ Кева.
Позвольте мне, однако, пройти через все возможные комбинации для будущих читателей. Пояснения в разделе Тест.
tr | резать
tr -s ' ' < file | cut -d' ' -f4
AWK
awk '{print $4}' file
удар
while read -r _ _ _ myfield _
do
echo "forth field: $myfield"
done < file
СЭД
sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file
тесты
Учитывая этот файл, давайте проверим команды:
$ 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 | резать
$ 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
удар
Это читает поля последовательно. Используя, _
мы указываем, что это одноразовая переменная как «нежелательная переменная», чтобы игнорировать эти поля. Таким образом, мы сохраняем $myfield
в файле 4-е поле, независимо от того, что между ними.
$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4
СЭД
Это ловит три группы пробелов и без пробелов с ([^ ]*[ ]*){3}
. Затем он захватывает все, что приходит до пробела в качестве 4-го поля, на котором он наконец напечатан \1
.
$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4