Я пытаюсь извлечь определенное (четвертое) поле из текстового потока, скорректированного по столбцам. Я пытаюсь использовать cut
команду следующим образом:
cat text.txt | cut -d " " -f 4
К сожалению, cut
не рассматривает несколько пробелов как один разделитель. Я мог бы пройти через awk
awk '{ printf $4; }'
или сед
sed -E "s/[[:space:]]+/ /g"
свернуть пробелы, но я хотел бы знать, есть ли способ иметь дело с cut
несколькими разделителями изначально?
Ответы:
Пытаться:
Со
tr
страницы руководства :источник
cat
здесь. Вы можете перейти< text.txt
непосредственно кtr
. en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat-d
и переводить сразу из нескольких символов в табуляцию. Например: я пришел сюда в поисках способа автоматического экспорта моего дисплея:who am i | tr -s ' ()' '\t' | cut -f5
echo "a b c" | cut -d " " -f2-
,echo "a b c" | tr -s " " | cut -d " " -f2-
Как вы прокомментируете в своем вопросе,
awk
это действительно путь. Использоватьcut
можно вместе с тем,tr -s
чтобы сжать пробелы, как показывает ответ Кева.Позвольте мне, однако, пройти через все возможные комбинации для будущих читателей. Пояснения в разделе Тест.
tr | резать
AWK
удар
СЭД
тесты
Учитывая этот файл, давайте проверим команды:
tr | резать
AWK
удар
Это читает поля последовательно. Используя,
_
мы указываем, что это одноразовая переменная как «нежелательная переменная», чтобы игнорировать эти поля. Таким образом, мы сохраняем$myfield
в файле 4-е поле, независимо от того, что между ними.СЭД
Это ловит три группы пробелов и без пробелов с
([^ ]*[ ]*){3}
. Затем он захватывает все, что приходит до пробела в качестве 4-го поля, на котором он наконец напечатан\1
.источник
awk
Он не только элегантен и прост, но и включен в VMware ESXi, гдеtr
отсутствует.awk
!read
команде, если нам все равно, что с ней происходит . Это может быть что угодно, просто это как-то стало стандартом вместоjunk_var
илиwhatever
:)самое короткое / самое дружелюбное решение
Разочаровавшись в слишком большом количестве ограничений
cut
, я написал свою собственную замену, которую я призвалcuts
«сократить на стероидах».порезы обеспечивает то, что, вероятно, является наиболее минималистичным решением этой и многих других проблем, связанных с вырезанием / вставкой
Один из многих примеров, касающихся этого конкретного вопроса:
cuts
опоры:paste
отдельно)и многое другое. Ничего из этого не предусмотрено стандартом
cut
.Смотрите также: https://stackoverflow.com/a/24543231/1296044
Источник и документация (бесплатное программное обеспечение): http://arielf.github.io/cuts/
источник
Этот однострочный текст Perl показывает, насколько тесно Perl связан с awk:
Однако
@F
массив autosplit начинается с индекса,$F[0]
а поля awk начинаются с$1
источник
С версиями, о которых
cut
я знаю, нет, это невозможно.cut
прежде всего полезен для разбора файлов, где разделитель не является пробелом (например/etc/passwd
) и имеет фиксированное количество полей. Два разделителя в строке означают пустое поле, и это также относится к пробелам.источник