2014-11-25 4 views
0

Я пытаюсь использовать 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!

+2

Вам необходимо поместить этот 'gsub' в блок действий. '{GSUB (...)}'. Сейчас это шаблон. Таким образом, он выполняет свою задачу, а затем говорит awk распечатать текущую строку. Если вам нужен только этот gsub, когда соответствует шаблон '$ 1 ~ ...', вы хотите поместить gsub в блок действий для этого шаблона (и вам также нужно будет добавить 'print'). –

+0

Это сработало для меня. Единственная проблема, которую я имею сейчас, это то, что это 'awk -F \, '$ 1 ~/[\ * \?]/&& $ 1! ~/^ \ * $ /' {Gsub (/\*/,".* ", 1 долл. США); gsub (/ \? /, "[0-9]", $ 1); gsub (/\*/,".*",$ 2); print} OFS =, file.txt' приводит к ошибке. Вероятно, потому что я делаю два сравнения регулярных выражений. Не уверен, как обойти это. – juanschwartz

+2

Вы закончили скрипт awk (одинарная кавычка) слишком рано. Одинарная кавычка должна быть после окончательного '; print}' не после '$ 1! ~/^ \ * $ /'. –

ответ

1

То, что я пишу здесь, не является решением вашего вопроса. Это всего лишь упражнение реорганизация ваших версий ... (для вас, чтобы завершить :). Некоторые из предложений @Etan wise все еще отсутствуют. (Стилистические проблемы могут сэкономить много времени).

awk (или любые решения с одним вкладышем) вводит в заблуждение в нем более 30 символов. Цитаты и т. Д. Становятся сложными.

Вы можете (должны?) Записать его в файл (a.awk) с правильным отступом, комментарии, вертикальные симметрий:

#!/usr/bin/gawk -f 

BEGIN       { FS="," ; OFS=","  } 

$1 ~ /[\*\?]/ && $1 !~ /^\*$/ { gsub(/\*/, ".*" ,$1); 
           gsub(/\?/, "[0-9]",$1); 
           gsub(/\*/, ".*" ,$2); 
           print; } 

и использовать его в качестве awk -f a.awk inputfile

Текущее поведение:

echo 'AH??0*,*,ARRAY RESISTIVITY,RESISTIVITY 
AHD*,*,MEASURED DEPTH,REFERENCE 
AI*,*,ACOUSTIC IMPEDANCE COMPRESSIONAL,GEOPHYSICAL SYNTHETICS 
AI_AVG_HOR_SIG,*,ACOUSTIC IMPEDANCE,ACOUSTIC 
*,FOO,BAR,BLEH' | awk -f /tmp/a1 

AH[0-9][0-9]0.*,.*,ARRAY RESISTIVITY,RESISTIVITY 
AHD.*,.*,MEASURED DEPTH,REFERENCE 
AI.*,.*,ACOUSTIC IMPEDANCE COMPRESSIONAL,GEOPHYSICAL SYNTHETICS 
+0

Я ценю это. Я смог накормить комментарии Etan и получить немного больше информации об awk, поскольку мне не приходилось часто его использовать. Однако, после погружения, я могу видеть, где это спасет меня много времени в будущем ... – juanschwartz

Смежные вопросы