Ответы:
Термин «поле» часто ассоциируется с такими инструментами, как cut
и awk
. Поле будет похоже на столбцы данных, если вы возьмете данные и разделите их, используя определенный символ. Обычно персонаж, используемый для этого, является Space.
Однако, как и в случае с большинством инструментов, он настраивается. Например:
awk -F"," ...
- разделяется запятыми (то есть ,).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.
Что касается этого переключателя, он просто 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.
Поле в соответствии с POSIX - это любая часть строки, разделенная любым из символов в IFS
« разделителе входного поля (или внутреннем разделителе поля )». Значением по умолчанию является пробел, за которым следует горизонтальный табулятор, за которым следует новая строка , С Bash вы можете запустить, printf '%q\n' "$IFS"
чтобы увидеть его значение.
cut
которых был задан вопрос.
cut -d "$IFS"
будет и ошибка, тогда как awk -F"[ \t\n]"
работает как ожидалось
Это зависит от рассматриваемой утилиты, но cut
«поле» начинается в начале строки текста и включает все до первой вкладки. Второе поле начинается с символа после первой вкладки и до следующей вкладки. И так далее для третьего, четвертого ... Все между вкладками, или между началом строки и вкладкой, или между вкладкой и концом строки.
Если вы не укажете разделитель полей с опцией "-d": cut -d: -f2
вы получите все между первым и вторым двоеточием (':') символов.
Другие утилиты имеют разные определения, но символ табуляции является обычным. awk
Это хороший запасной вариант, если cut
он слишком строг, поскольку awk
разделяет поля на основе одного или нескольких пробельных символов. Это немного более естественно во многих ситуациях, но вы должны знать немного синтаксиса. Чтобы напечатать второе поле в соответствии с awk
:
awk '{print $2}'
sort
это тот, который обманывает меня. Моя текущая sort
страница руководства говорит что-то вроде «непустой переход к пустому» для разделителя полей. По некоторым причинам требуется несколько попыток, чтобы sort
правильно определить поля. join
по-видимому, используются поля «разделенные пробелами», что и awk
подразумевается по умолчанию.
Мораль этой истории - быть осторожным и экспериментировать, если вы не знаете.
Термин «поле» относится не к Linux в целом, а к конкретным программам. Так что cut
использует другой вид поля, чем sort
.
С помощью cut
вы сами определяете, что такое поле, указав разделитель полей с помощью опции -d, которая разделяет поля в каждой строке.
Если ваши данные разделены двоеточиями в строках, вы можете объединить -d
и -f
получить поля (или столбцы) 2, 3 и 6 следующим образом:
echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
Когда вы используете cut
команду, тогда она принимает два основных аргумента
-d: что обозначает разделитель
-f: где обозначается поле, которое будет вырезано из входного файла
Ex. cut - d "|" - f1, 2 input_filename
Здесь output
разделитель будет разделен символом "|" и он будет вырезать только 2 поля из входного файла
Если у вас есть следующие строки в вашем файле
Alex|120000|Admin|1999
Затем он будет вырезать 2 поля, которые
Alex|120000
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
опции легко ошибиться.
echo '$IFS' | cat -vet
чтобы увидеть, как выглядит значение по умолчанию вshell
.