Я хочу использовать пробел как разделитель с помощью команды cut
.
Какой синтаксис я могу использовать для этого?
Я хочу использовать пробел как разделитель с помощью команды cut
.
Какой синтаксис я могу использовать для этого?
cut -d ' ' -f 2
Где 2 - номер поля поля, разделенного пробелом.
Обычно, если вы используете пробел как разделитель, вы хотите обрабатывать несколько пробелов как одно, потому что вы анализируете вывод команды, выравнивающей некоторые столбцы с пробелами. (и поиск Google для этого приведет меня сюда)
В этом случае одной команды cut
недостаточно, и вам нужно использовать:
tr -s ' ' | cut -d ' ' -f 2
Или
awk '{print $2}'
Вы также можете сказать
cut -d\ -f 2
обратите внимание, что после обратного слэша есть два пробела.
В дополнение к существующим, полезным ответам; tip of the hat to QZ Support, чтобы побудить меня опубликовать отдельный ответ:
Здесь действуют два разных механизма:
(a) сам ли cut
требует разделителя (пробел в этом случае), переданного в опцию -d
, чтобы быть отдельным аргументом или допустимо добавить его непосредственно к -d
.
(b) как оболочка обычно анализирует аргументы перед передачей их в вызываемую команду.
(a) отвечает цитата из рекомендации POSIX для утилит (внимание мое)
Если SYNOPSIS стандартной утилиты показывает параметр с обязательным параметром-аргументом [...], соответствующее приложение должно использовать отдельные аргументы для этого параметра и его аргумент-аргумент. Однако соответствующая реализация также позволяет приложениям указывать опцию и параметр-аргумент в той же строке аргумента без промежуточных символов.
Другими словами: в этом случае , поскольку параметр -d
option-argument является обязательным, , вы можете указать, следует ли указывать разделитель как:
-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 - без кавычек или \
префикс! - как часть того же аргумента.
Причина, по которой формы в соответствующих группах в конечном счете идентичны, в два раза, на основе , как оболочка анализирует строковые литералы:
'...'
берется буквально и образует один аргумент"..."
также формирует один аргумент, но подлежит интерполяции (расширяет ссылки на переменные, такие как $var
, подстановки команд ($(...)
или `...`
) или арифметические разложения ($(( ... ))
).\
-котирование отдельных символов: a \
, предшествующий одному символу, заставляет этот символ интерпретироваться как литерал.'...'
или "..."
или \
экземпляры)), поэтому вызываемая команда никогда не видит символы кавычек.scut, утилита, подобная разрезам (более умная, но медленная, чем я сделал), которая может использовать любое perl-регулярное выражение в качестве ломающего токена. Разбиение по пробелу является значением по умолчанию, но вы также можете разбивать на много- char регулярные выражения, альтернативные регулярные выражения и т.д.
scut -f='6 2 8 7' < input.file > output.file
поэтому приведенная выше команда будет разбивать столбцы на пробелы и извлекать (0-based) cols 6 2 8 7 в этом порядке.
I только что открыл, что вы также можете использовать "-d "
:
cut "-d "
$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am
Вы не можете сделать это легко с помощью разреза, если у данных есть, например, несколько пробелов. Я нашел иногда полезным для нормализации ввода для более легкой обработки. Один трюк - использовать sed для нормализации, как показано ниже.
echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2 #bar