Які точні відмінності між awk та cut з grep? [зачинено]


30

Ми знаємо, що можемо отримати другий стовпець потрібного рядка з файлу за допомогою цих двох методів:

awk '/WORD/ { print $2 }' filename

або

grep WORD filename| cut -f 2 -d ' '

Мої запитання:

  • Які відмінності між двома командами вище?
  • Який із найкращих результатів?
  • Які переваги використання awkнад використанням cut, і навпаки?
  • Які варіанти awkнам надають cutі навпаки?

це echo filenameчи cat filename?
Авінаш Радж

@AvinashRaj вибачте, відредаговано
Networker

Відповіді:


35

Найбільш помітна різниця між вашими двома рядками буде залежати від введення. cutприймає один символ -dяк роздільник поля (типовим значенням є TAB), і кожне виникнення цього символу починає нове поле. awkоднак є більш гнучким. Розділювач знаходиться в FSзмінній і може бути порожнім рядком (кожен символ введення робить окреме поле), окремим символом або регулярним виразом. Особливий випадок одного символу пробілу (за замовчуванням) означає розділити на будь-яку послідовність пробілів. Також awkза замовчуванням пригнічує провідний пробіл.

Порівняйте:

$ echo "abc def" | cut -f 2 -d ' '
def
$ echo "abc    def" | cut -f 2 -d ' '

$ echo " abc def" | cut -f 2 -d ' '
abc


$ echo "abc def" | awk '{ print $2 }'
def
$ echo "abc    def" | awk '{ print $2 }'
def
$ echo " abc def" | awk '{ print $2 }'
def

Тут awkрозбивається на послідовність пробілів між abcі, defтоді як cutкожен пробіл приймається як роздільник.

Що ви приймаєте, залежатиме від того, чого ви хочете досягти. В іншому випадку я б очікував, що cutце буде швидше, оскільки це менший, єдиний інструмент, тоді як він awkмає свою мову програмування.


що те, що я хочу як відповідь, дякую, я позначу це питання як відповів @Dubu
Networker

1
cutшвидше за все, Awk тільки , але це не так точно, що grep ... | cutбуде швидше, ніж чистий Awk.
Wildcard

8

Взагалі кажучи, чим більш спеціалізований інструмент, тим швидше він. Тож у більшості випадків можна очікувати cutі grepшвидшого sed, і sedшвидшого, ніж awk. Якщо ви порівнюєте більш довгі конвеєри простіших інструментів з одним викликом більш складного інструменту, не існує жодного принципу. Це стосується лише великих вкладів (скажімо, мільйонів рядків); для коротких входів різниці ви не побачите.

Перевага більш складних інструментів - це, звичайно, те, що вони можуть робити більше речей.

Ваші команди непотрібно використовують кішку. Використовуйте натомість переадресацію (особливо якщо ви переживаєте за швидкість, хоча, швидше за все, ви не повинні турбуватися про швидкість, поки не запустите контрольні показники¹).

<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '

Ці команди майже рівноцінні. Відмінності:

  • У awk і grep є різні синтаксиси regexp . Awk і grep -Eмають майже однакові синтаксиси regexp (розширені регулярні вирази).
  • cut -d ' 'розглядає кожного окремого космічного символу як роздільник. Розмежувачем за замовчуванням Awk є будь-яка послідовність пробілів, яка може бути декількома пробілами, вкладкою тощо. Ви не можете використовувати довільні послідовності пробілів як роздільники cut. Для того, щоб використовувати окремі прогалини в якості роздільників в AWK, встановіть роздільник полів в регулярний вираз , яке відповідає єдиний простір, крім регулярного виразу , що складається з одного простору (яке є окремим випадком означає «будь-яка послідовність прогалин», тобто за замовчуванням): awk -F '[ ]' '/WORD/ {print $2}'.

¹ Перше правило оптимізації програми: не робіть цього. Друге правило оптимізації програми (лише для експертів!): Не робіть цього ще. - Майкл А. Джексон


1

Ваша команда,

cat fileName | awk '/WORD/ { print $2 }'

Вам навіть catкоманда не потрібна . Ви можете спробувати,

awk '/WORD/ { print $2 }' filename

І нижченаведена команда переспрямовує вихід з cat на grep, а потім на скорочення,

cat fileName | grep WORD | cut -f 2 -d ' '

Найімовірніше, ми повинні уникати перенаправлення виводу. Awk виконує завдання в одному рядку, але йому cutпотрібна grepкоманда, щоб отримати лише рядки, які містять певне слово, і він друкує стовпчик 2 відповідно до розділового простору.

Ви можете робити речі дивним чином, якщо вирізати не вдасться.


3
ps Вам також не потрібна команда cat для grep. Можна просто зробити grep WORD filename.
foops

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