объединить две команды без конвейера (awk и sed)

У меня есть команда, которая использует awk и sed.

awk '{$1=""; print $0}' file.txt | sed "1s/.*/D,,3/" #awk command removes first column from file.txt and prints the rest, sed inserts "D,,3" on the first line

Я получаю желаемый результат для команды выше. Однако я стараюсь избегать использования каналов, есть ли способ объединить две приведенные выше команды и получить тот же результат без использования канала.

first : awk '{$1=""; print $0}' file.txt
second: sed "1s/.*/D,,3/"

file.txt:
row 3:
name      john doe
state     Florida
age       32
-1
22.02.2017, 03:07
1 ответ

AWK и sed являются полными по Тьюрингу , поэтому все, что может делать один, может делать и другой. (Что касается преобразования текста, то есть awk имеет больше возможностей взаимодействия с ОС.) Однако у каждой есть свои сильные и слабые стороны. Awk может легко делать большую часть того, что может делать sed, но некоторые вещи, такие как замена регулярных выражений группами, являются более сложными. Теоретически Sed может делать все, что умеет awk, но со значительными трудностями (например, в sed нет целочисленной арифметики, поэтому вам придется кодировать его с помощью текстовых преобразований). Поэтому, если вы хотите объединить все в одной команде, лучше всего подойдет awk.

awk 'NR==1 {print "D,,3"; next} {$1=""; print $0}' file.txt

Здесь sed также может легко делать то, что вы делаете с awk: нормализовать пробелы и сокращать все до первого пробела.

sed "s/[ \t][ \t]*/ /g; s/^ *[^ ][^ ]*/ /; s/^ $//; 1s/.*/D,,3/" file.txt

Комбинирование двух команд здесь не особенно полезно. Я не ожидаю прироста производительности. Для каждого канала наблюдается снижение производительности, поскольку данные должны передаваться от одной команды к другой. Однако может быть и повышение производительности. Если у вас несколько процессоров, две команды могут выполняться параллельно. Если для определенных вещей используется более специализированная команда (например,используя специальные инструменты, такие как grep и head вместо универсального инструмента, такого как awk), эта более специализированная команда обычно выполняется быстрее. Компенсируют ли выигрыши накладные расходы канала, зависит от данных, от инструментов, от того, сколько у вас ядер и т. Д.

Если этот сценарий не является узким местом производительности, сначала подумайте о ясности. В этом случае я бы избегал чистой версии sed - она ​​может быть немного быстрее, но гораздо менее читабельна. (Возможно, это можно упростить при определенных предположениях о ваших данных, например, если вы знаете, что всегда будет как минимум два поля и что разделитель полей всегда будет одним пробелом, или вы не заботитесь о сохранении количества пробелов.) Я считаю, что проще делать все в awk, но это почти ничто между этим и вашей версией awk + sed.

3
28.01.2020, 05:07

Теги

Похожие вопросы