Использовать пробел в качестве разделителя с командой cut

Я хочу использовать пробел как разделитель с помощью команды cut.

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

Ответ 1

cut -d ' ' -f 2

Где 2 - номер поля поля, разделенного пробелом.

Ответ 2

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

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

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

Или

awk '{print $2}'

Ответ 3

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

cut -d\  -f 2

обратите внимание, что после обратного слэша есть два пробела.

Ответ 4

В дополнение к существующим, полезным ответам; tip of the hat to QZ Support, чтобы побудить меня опубликовать отдельный ответ:

Здесь действуют два разных механизма:

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

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

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

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

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

  • (s): a отдельный аргумент
  • (d) ИЛИ: как значение , непосредственно привязанное к -d.

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

  • При подходе (s) все следующие формы EQUIVALENT:

    • -d ' '
    • -d " "
    • -d \<space> # <space> used to represent an actual space for technical reasons
  • При подходе (d) все следующие формы EQUIVALENT:

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

Эквивалентность объясняется обработкой строкового литерала оболочки:

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

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

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

Причина, по которой формы в соответствующих группах в конечном счете идентичны, в два раза, на основе , как оболочка анализирует строковые литералы:

  • Оболочка позволяет специфицировать литерал как через механизм с именем quoting, который может принимать несколько форм:
    • одиночные кавычки: содержимое внутри '...' берется буквально и образует один аргумент
    • строки с двойными кавычками: содержимое внутри "..." также формирует один аргумент, но подлежит интерполяции (расширяет ссылки на переменные, такие как $var, подстановки команд ($(...) или `...`) или арифметические разложения ($(( ... ))).
    • \ -котирование отдельных символов: a \, предшествующий одному символу, заставляет этот символ интерпретироваться как литерал.
  • Цитата дополняется цитатой удаления, что означает, что после того, как оболочка провела синтаксический анализ командной строки, удаляет символы кавычек из аргументов (включая '...' или "..." или \ экземпляры)), поэтому вызываемая команда никогда не видит символы кавычек.

Ответ 5

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

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

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

Ответ 6

I только что открыл, что вы также можете использовать "-d ":

cut "-d "

Test

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

Ответ 7

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

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