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

16

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

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

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

luca590
источник

Ответы:

19

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

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

  • 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запрещает выводить строки, которые не содержат символ разделителя, указанный с помощью -dпереключателя.

пример

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

$ cat sample.txt 
This is a space string.
This is a space   and   tab string.
Thisstringcontainsneither.

ПРИМЕЧАНИЕ. Во 2-й строке выше есть пробелы и символы табуляции.

Теперь, когда мы обрабатываем эти строки, используя 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  

Во 2 - ом примере вы можете увидеть , что -sпереключатель опущен любые строки из вывода , которые не содержат разделитель, Space.

SLM
источник
8

Поле в соответствии с POSIX - это любая часть строки, разделенная любым из символов в IFS« разделителе входного поля (или внутреннем разделителе поля )». Значением по умолчанию является пробел, за которым следует горизонтальный табулятор, за которым следует новая строка , С Bash вы можете запустить, printf '%q\n' "$IFS"чтобы увидеть его значение.

l0b0
источник
Сделайте a, echo '$IFS' | cat -vet чтобы увидеть, как выглядит значение по умолчанию в shell.
C0deDaedalus
1
IFS используется оболочкой для большинства целей (не для всех), но не для других программ и, в частности, не для cutкоторых был задан вопрос.
dave_thompson_085
В отличие от awk, cut также поддерживает только один разделитель за раз, поэтому cut -d "$IFS"будет и ошибка, тогда как awk -F"[ \t\n]"работает как ожидалось
JGurtz
2

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

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

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

awk '{print $2}'

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

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

Брюс Эдигер
источник
2

Термин «поле» относится не к Linux в целом, а к конкретным программам. Так что cutиспользует другой вид поля, чем sort.

С помощью cutвы сами определяете, что такое поле, указав разделитель полей с помощью опции -d, которая разделяет поля в каждой строке.

Если ваши данные разделены двоеточиями в строках, вы можете объединить -dи -fполучить поля (или столбцы) 2, 3 и 6 следующим образом:

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
Volker Siegel
источник
1

Когда вы используете cutкоманду, тогда она принимает два основных аргумента

-d: что обозначает разделитель

-f: где обозначается поле, которое будет вырезано из входного файла

Ex. cut - d "|"  - f1, 2 input_filename

Здесь outputразделитель будет разделен символом "|" и он будет вырезать только 2 поля из входного файла

Если у вас есть следующие строки в вашем файле

Alex|120000|Admin|1999

Затем он будет вырезать 2 поля, которые

Alex|120000
Шах мед
источник
Ваш пример полностью разбит из-за неправильных пробелов, и даже если он правильный, это ничего не добавляет к ответам, данным 4 года назад.
dave_thompson_085
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опции легко ошибиться.

Лоуренс Реншоу
источник