Что представляет собой «поле» для команды вырезания?

Например, команда cut может принимать параметр -f, который согласно man

  

выберите только эти поля; также распечатать любую строку, которая не содержит                 разделитель, если не указана опция -s

В этом контексте, что такое поле?

16 голосов | спросил luca590 29 MaramSat, 29 Mar 2014 05:11:16 +04002014-03-29T05:11:16+04:0005 2014, 05:11:16

4 ответа


19

Термин «поле» часто связан с такими инструментами, как cut и awk. Поле будет похоже на значение столбцов данных, если вы берете данные и разделяете их с помощью определенного символа. Обычно для этого используется символ Пробел .

Однако, как и в большинстве инструментов, он настраивается. Например:

  • awk = awk -F"," ... - будет разделяться запятыми (т. е. , ).
  • cut = cut -d"," ... - будет разделяться запятыми (т. е. , ).

Примеры

Этот первый показывает, как awk автоматически разбивается на пробелы.

$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.

Это показывает, как cut будет разбиваться и на пробелы.

$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.

Здесь у нас есть список столбцов CSV, который мы используем cut для возврата столбцов 1 & 4.

$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4

Awk тоже может это сделать:

$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4

Awk также немного более разбирается в работе с различными символами разделения. Здесь он имеет дело с Tabs вместе с Spaces , где они смешиваются в одно и то же время:

$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.

Как насчет переключателя -s нарезать?

Что касается этого переключателя, он просто сообщает cut, чтобы не печатать строки, которые не содержат символ разделителя, указанный с помощью ---- +: = 13 =: + ----.

Пример

Скажем, у нас был этот файл.

-d

ПРИМЕЧАНИЕ. Во второй строке выше указаны пробелы и вкладки.

Теперь, когда мы обрабатываем эти строки с помощью $ cat sample.txt This is a space string. This is a space and tab string. Thisstringcontainsneither. с и без cut:

-s

Во втором примере вы можете видеть, что переключатель $ cut -d" " -f1-6 sample.txt This is a space string. This is a space Thisstringcontainsneither. $ cut -d" " -f1-6 -s sample.txt This is a space string. This is a space опустил любые строки из вывода, которые не содержат разделителя, Space .

ответил slm 29 MaramSat, 29 Mar 2014 06:56:19 +04002014-03-29T06:56:19+04:0006 2014, 06:56:19
8

Поле в соответствии с POSIX - это любая часть строки, помеченная любым из символов в IFS , "

ответил l0b0 29 MarpmSat, 29 Mar 2014 14:21:55 +04002014-03-29T14:21:55+04:0002 2014, 14:21:55
2

Это зависит от рассматриваемой утилиты, но для cut «начало» начинается в начале строки текста, и включает все до первой вкладки. Второе поле начинается с символа после первой вкладки, вплоть до следующей вкладки. И так далее для третьего, четвертого ... Все между вкладками или между началом строки и вкладкой или между вкладкой и концом строки.

Если вы не укажете разделитель полей с опцией «-d»: cut -d: -f2 вы получите все, что угодно между первым и вторым двоеточием (' : ').

Другие утилиты имеют разные определения, но общий символ табуляции. awk является хорошим снижением, если cut слишком строг, поскольку awk делит поля на основе одного или нескольких пробельных символов. Это немного более естественно во многих ситуациях, но вы должны знать немного синтаксиса. Чтобы напечатать второе поле в соответствии с awk:

awk '{print $2}'

sort - это тот, который меня обманывает. Моя текущая страница sort говорит что-то вроде «незаполненный переход» для полевого разделителя. По какой-то причине требуется несколько попыток правильно определить поля sort. join, по-видимому, использует поля «с разделителями по пробелам», что означает awk по умолчанию.

Мораль истории - быть осторожным и экспериментировать, если вы не знаете.

ответил Bruce Ediger 29 MaramSat, 29 Mar 2014 05:29:14 +04002014-03-29T05:29:14+04:0005 2014, 05:29:14
0

cut отлично подходит для простых случаев, где разделитель является единственным символом, и вы хотите вывести подмножество полей ввода, в том же порядке (даже если я укажу -f3,2,1, он действует так же, как -f1,2,3).

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

Например wc -l myfile | awk '{print $1}' или ls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}' очень просты, но было бы трудно сделать с помощью cut.

Я согласен с более ранними плакатами, что поля /ключи в sort трудно понять! Поля в join кажутся такими же, как в cut, хотя параметры join легко ошибаются.

ответил Laurence Renshaw 4 AMpFri, 04 Apr 2014 07:28:19 +040028Friday 2014, 07:28:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132