Відповіді:
Термін "поле" часто асоціюється з такими інструментами, як 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.
ПРИМІТКА. У другому рядку вище є пробіли та вкладки.
Тепер, коли ми обробляємо ці рядки, використовуючи перемикач 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
сторінці "man man" йдеться про щось на зразок "перехід з порожнього на порожній" для сепаратора поля. Чомусь потрібно кілька спроб, щоб 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
.