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

209

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

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

  • 31
    Неправда, справочная страница для cut не объясняет этого и, как правило, не информативна
  • 1
    Кроме того, «сокращение информации» не является улучшением в этом случае.
Показать ещё 4 комментария
Теги:
cut

7 ответов

241
Лучший ответ
cut -d ' ' -f 2

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

  • 1
    Можете ли вы указать cut использовать любое количество определенного символа в качестве разделителя, как в RegEx? например, любое количество пробелов, например, \ s +
  • 3
    @ foampile Нет, я не верю, что ты можешь.
Показать ещё 1 комментарий
100

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

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

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

Или

awk '{print $2}'
  • 2
    Спасибо за пример использования awk, именно то, что мне было нужно.
29

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

cut -d\  -f 2

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

  • 39
    Очень нечитабельно - кто замечает, что есть 2 пробела?
  • 26
    Человек, который знает, что «\» убегает от следующего символа, будет очень осторожен, чтобы заметить, что будет дальше. Использование «\» для экранирования таких символов - очень распространенная идиома.
Показать ещё 4 комментария
26

В дополнение к существующим, полезным ответам; 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 \, предшествующий одному символу, заставляет этот символ интерпретироваться как литерал.
  • Цитата дополняется цитатой удаления, что означает, что после того, как оболочка провела синтаксический анализ командной строки, удаляет символы кавычек из аргументов (включая '...' или "..." или \ экземпляры)), поэтому вызываемая команда никогда не видит символы кавычек.
3

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

cut "-d "

Test

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am
  • 1
    Действительно - или '-d ' .
  • 3
    Обратите внимание, что с точки зрения cut все следующие элементы идентичны: "-d " , '-d ' , -d" " , -d' ' и -d\<space> : все формы напрямую добавляют аргумент option ( пробел) к параметру ( -d ) и в результате к тому же моменту времени, в течение которого их увидит cut получится точно такая же строка : один аргумент, содержащий d, за которым следует пробел после того, как оболочка выполнила удаление кавычек
Показать ещё 3 комментария
3

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

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

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню