Що являє собою "поле" для команди cut?


16

Наприклад, cutкоманда може приймати параметр -f, який відповідно доman

виберіть лише ці поля; також надрукувати будь-який рядок, що не містить символу роздільника, якщо не вказано параметр -s

У цьому контексті що таке поле?

Відповіді:


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.

ПРИМІТКА. У другому рядку вище є пробіли та вкладки.

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


8

Поле згідно з POSIX - це будь-яка частина рядка, обмежена будь-яким із символів IFS, " роздільник поля введення (або внутрішній роздільник поля" ). Значенням за замовчуванням цього є пробіл з подальшим горизонтальним табулятором з наступним новим рядком . За допомогою Bash ви можете запустити, printf '%q\n' "$IFS"щоб побачити його значення.


Зробіть 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сторінці "man man" йдеться про щось на зразок "перехід з порожнього на порожній" для сепаратора поля. Чомусь потрібно кілька спроб, щоб 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

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варіанти легко помилитися.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.