Відповіді:
Термін "поле" часто асоціюється з такими інструментами, як 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.