Как определить разделитель «табуляция» с «вырезать» в BASH?

215

Вот пример использования cutдля разбиения ввода на поля с использованием разделителя пробелов и получения второго поля:

cut -f2 -d' '

Как разделитель может быть определен как табуляция, а не пробел?

Мухаммед Хасан Хан
источник
4
Tab является разделителем по умолчанию. cut -f 2
Мелах

Ответы:

301

Два пути:

Нажмите Ctrl+ Vи затем Tab.

cut -f2 -d'   ' infile

или напишите это так:

cut -f2 -d$'\t' infile
Birei
источник
10
$ '' - Башизм, AFAIR
Пой
8
Ни одна из них не работает в Windows (например, Git Bash), очевидно. Используйте ответ @ Mikel (разделитель по умолчанию - tab, просто опустите -dаргумент).
Ахмед Фасих
4
@poige, это ksh93не так bash. Это поддерживается, по крайней мере, ksh93, zsh, bash, mksh и FreeBSD sh ( это может привести к следующему серьезному изменению спецификации стандарта POSIX дляsh ).
Стефан
3
@micurb Это ANSI-C процитировать: gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html
wisbucky
191

Вкладка по умолчанию.

Смотрите страницу справочника .

-d delim
         Use delim as the field delimiter character instead of the tab
         character.

Так что вы должны просто написать

cut -f 2
Mikel
источник
2
Упс не заметил эту строку.
Мухаммед Хасан Хан
4
Но, вероятно, всегда безопаснее явно упоминать такие флаги для удобства чтения и переносимости. Я могу себе представить, что некоторые люди, разрабатывающие cutдля Windows, не будут следовать полному стандарту.
Виллем Ван Онсем
3
На это должен быть принят ответ: простейший код, простейшее объяснение. я прибил его: youtube.com/watch?v=dpNTHl7y45Y
нейронет
5
Этот ответ изменил мою жизнь
matheeeny
1
@WillemVanOnsem, если кто-то пишет версию cutдля Windows и не следует для нее спецификации POSIX , нет никаких оснований предполагать, что любой сценарий POSIX будет работать с этой системой. Придерживайтесь POSIX-указанных функций. Не пытайтесь учесть гипотетические будущие несоответствующие реализации; это не то, что означает переносимость.
Wildcard
12
awk -F '\t' '{ print $2 }' inputfile

Это извлекает второе разделенное табуляцией поле каждой строки ввода из inputfile.

Ilja
источник
10

В более общем смысле, не требуя каких-либо невидимых символов: используйте trдля преобразования разделителей в формат, который может быть указан более легко cut.

$ echo -e "a\tb\tc" |tr '\t' ' ' |cut -d' ' -f2
b

tr это простой, но мощный инструмент для подбора и замены символов.

nobar
источник
1
Но что, если ввод abc(space)def(tab)ghi? Ваш ответ уступит def, но должен уступить ghi. Точно так же, если ввод ABC(tab)DEF(space)GHI, ваш ответ даст DEF, но он должен дать DEF(space)GHI.
G-Man
@ G-Man: разделитель пространства был только примером. Используйте любой разделитель, подходящий для ваших данных - например, запятую. echo -e "abc\tdef ghi" |tr '\t' ',' |cut -d',' -f2
Нобар
... Но, да, если разделитель должен быть вкладкой, то мой подход не сработает.
Нобар