Каковы точные различия между 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
источник
что то, что я хочу в качестве ответа, спасибо, я отмечу вопрос как отвеченный @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 имеют разные синтаксисы регулярных выражений . Awk и grep -Eимеют почти идентичные синтаксисы регулярных выражений (расширенные регулярные выражения).
  • cut -d ' 'рассматривает каждый отдельный пробел как разделитель. Разделителем Awk по умолчанию является любая последовательность пробелов, которая может состоять из нескольких пробелов, табуляции и т. Д. Вы не можете использовать произвольные последовательности пробелов в качестве разделителей cut. Для того, чтобы использовать отдельные пробелы в качестве разделителей в AWK, установите разделитель полей в регулярное выражение , которое соответствует единое пространство, кроме регулярного выражения , состоящего из одного пространства (которое является частным случаем означает «любая последовательность пробелов», то есть по умолчанию): awk -F '[ ]' '/WORD/ {print $2}'.

Ru Первое правило оптимизации программы: не делайте этого. Второе правило оптимизации программы (только для экспертов!): Пока не делайте этого. - Майкл А. Джексон

Жиль "ТАК - прекрати быть злым"
источник
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 в соответствии с пробелом.

Вы можете делать вещи в awk, если вырезать не удается.

Авинаш Радж
источник
3
ps вам также не нужна команда cat для grep. Вы можете просто сделать grep WORD filename.
Фопс
@ edvinas.me да.
Авинаш Радж