используйте пробел как разделитель с командой cut

Я хочу использовать пробел в качестве разделителя с .

какой синтаксис я могу использовать для этого?

8 ответов


cut -d ' ' -f 2

где 2-номер поля, разделенного пробелами, которое вы хотите.


обычно, если вы используете пробел в качестве разделителя, вы хотите рассматривать несколько пробелов как один, потому что вы анализируете вывод команды, выравнивающей некоторые столбцы с пробелами. (и поиск google для этого привел меня сюда)

В этом случае один cut команды недостаточно, и вам нужно использовать:

tr -s ' ' | cut -d ' ' -f 2

или

awk '{print }'

вы также можете сказать

cut -d\  -f 2

обратите внимание, что есть два пробела после косой черты.


чтобы дополнить существующие, полезные ответы; кончик шляпы к поддержка QZ за поощрение меня опубликовать отдельный ответ:

два различных механизма вступить в игру здесь:

  • (a) будь cut требуется разделитель (пробел, в данном случае), переданный быть отдельный аргумент или приемлемо ли добавить его напрямую до -d.

  • (b) как shell обычно анализирует аргументы перед передачей их вызываемой команде.

(a) отвечает цитатой из рекомендации POSIX для утилит (выделено мной)

если синопсис стандартной утилиты показывает опцию с обязательное option-аргумент [...] соответствующее заявление использовать отдельные аргументы для этой опции и ее option-argument. , соответствующая реализация будет и разрешить приложениям указывать параметр и параметр-аргумент в одной строке аргумента без промежуточных символов.

другими словами: в данном случае, , потому что -dпараметр-аргумент обязательное, вы можете выбрать указать ли разделитель как:

  • (s) либо: a отдельные аргумент
  • (d) или: как значение напрямую подключен до -d.

как только вы выбрали (ы) или (d), это shellстроковый литеральный синтаксический анализ - (b) - это имеет значение:

  • С (s) все следующие формы эквивалентны:

    • -d ' '
    • -d " "
    • -d \<space> # <space> used to represent an actual space for technical reasons
  • С (d), все следующие формы эквивалентны:

    • -d' '
    • -d" "
    • "-d "
    • '-d '
    • d\<space>

эквивалентность объясняется shell's строка-литерал обработки:

все решения выше приводят к точно такая же строка (в каждой группе) на момент cut видит:

  • (s): cut видит -d, а его собственные аргумент, за которым следует отдельные аргумент, содержащий пробел char-без кавычек или \ префикс!.

  • (d): cut видит -d плюс пробел char-без кавычек или \ префикс! - как часть то же самое


Я обнаружил что вы также можете использовать "-d ":

cut "-d "

тест

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am

scut, cut-like утилита (умнее, но медленнее я сделал), которая может использовать любое регулярное выражение perl в качестве токена разрыва. Ломая на пробел по умолчанию, но вы также можете разбить на мульти-чар регулярные выражения, альтернативные регулярные выражения и т. д.

scut -f='6 2 8 7' < input.file  > output.file

таким образом, вышеуказанная команда будет разбивать столбцы на пробелы и извлекать (0-based) cols 6 2 8 7 в этом порядке.


вы не можете сделать это легко с помощью cut, если данные имеют, например, несколько пробелов. Я нашел полезным нормализовать ввод для упрощения обработки. Один из трюков-использовать sed для нормализации, как показано ниже.

echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2  #bar

у меня есть ответ (я признаю, что несколько запутанный ответ), который включаетsed регулярные выражения и захвата группы:

  • \S* - первое слово
  • \s* - разделитель
  • (\S*) - второе слово - плен
  • .* - остаток строки

как sed выражение, группа захвата должна быть экранирована, т. е. \( и \).

на возвращает копию захваченная группа, то есть второе слово.

$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*//'
beta

когда вы смотрите на этот ответ, его несколько запутанной, и вы можете подумать: зачем? Ну, я надеюсь, что некоторые, может пойти "Ага!"и будет использовать этот шаблон для решения некоторых сложных проблем извлечения текста с помощью одного sed выражение.