Я пытаюсь использовать awk, чтобы сделать две вещи. Я хочу разделить список на три отдельных списка и преобразовать 1 или 2 столбца каждого в регулярное выражение. Когда я подключаю awk к себе, т. Е. Выбираю мои объекты в моем списке, а затем использую awk для подстановок, он добавляет 1 к элементам списка.Порядок операций в awk?
Я полагаю, что мне не нужно прокладывать awk себе и вместо этого делать все это одним вызовом awk.
Список можно было бы быть линии, как линии 4, без каких-либо групповых символов в первой колонке, заменив подстановочные знаки в колонке 2.
Список две бы для линий 1,2 и 3 в отдельном списке и необходимо будет выполнить замены на столбцах 1 и 2.
Наконец, мне нужно сделать аналогичную вещь для строки 5 в отдельном списке.
Я могу получить эти списки, делая это.
Линия 4: awk -F \, '$1!~/([\*\?])/' file.txt
Линии 1-3: awk -F \, '$1~/([\*\?])/' file.txt
Line 5: awk -F \, '$1~/^\*$/' file.txt
Мои сабвуферы * => * и.? => [0-9].
Когда я пытаюсь использовать gsub вот так awk -F \, 'gsub(/\*/,".*",$2) $1!~/([\*\?])/' OFS=, file.txt
, список возвращается фанки с неожиданными результатами. Я чувствую, что есть фундаментальная вещь, которую я не понимаю об awk в отношении операций стекирования.
Halp!
Вам необходимо поместить этот 'gsub' в блок действий. '{GSUB (...)}'. Сейчас это шаблон. Таким образом, он выполняет свою задачу, а затем говорит awk распечатать текущую строку. Если вам нужен только этот gsub, когда соответствует шаблон '$ 1 ~ ...', вы хотите поместить gsub в блок действий для этого шаблона (и вам также нужно будет добавить 'print'). –
Это сработало для меня. Единственная проблема, которую я имею сейчас, это то, что это 'awk -F \, '$ 1 ~/[\ * \?]/&& $ 1! ~/^ \ * $ /' {Gsub (/\*/,".* ", 1 долл. США); gsub (/ \? /, "[0-9]", $ 1); gsub (/\*/,".*",$ 2); print} OFS =, file.txt' приводит к ошибке. Вероятно, потому что я делаю два сравнения регулярных выражений. Не уверен, как обойти это. – juanschwartz
Вы закончили скрипт awk (одинарная кавычка) слишком рано. Одинарная кавычка должна быть после окончательного '; print}' не после '$ 1! ~/^ \ * $ /'. –