Допустим, у меня есть текстовый файл, как:
R1 12 324 3453 36 457 4 7 8
R2 34 2342 2525 25 25 26 26 2 2
R3 23 2342 32 52 54 543 643 63
R4 25 234 2342 4 234242
Я хочу использовать awk
для обработки этих строк по-разному, как
awk '/R1/ { print "=>" $0} /R2/ { print "*" $0} '
и я хочу также напечатать все остальные строки, как они есть (без дублирования строк, которые я уже обработал), в основном мне нужно /ELSE/ { print $0}
в конце моей awk
строки.
Что-то подобное существует?
awk
реализует обычные подозреваемые, когда дело доходит до условных. Это хорошая идея, чтобы использоватьprintf
вместоprint
той работы, которую вы хотите сделать на матче.источник
if-then-else
.next
является важным инструментом в программировании на awk.printf
здесь. Его единственное преимущество (если вы не занимаетесь более сложным форматированием, чем конкатенация), заключается в том, что он не добавляет символ новой строки, что здесь не имеет значения.print
только выводить,$0
тогда какprintf
должен анализировать строку формата.Крис Даун уже показал, как можно получить другое выражение для регулярных выражений, используя явный оператор if в блоке. Вы также можете получить тот же эффект в некоторых других отношениях, хотя его решение, вероятно, лучше.
Одним из них является написание третьего регулярного выражения, которое будет соответствовать только тексту, который не соответствует другим, в вашем случае это будет выглядеть примерно так:
Обратите внимание, что здесь используются привязанные регулярные выражения - символ ^ в начале регулярного выражения будет совпадать только в начале строки - ваши исходные шаблоны этого не делали, что немного замедляет сопоставление, так как будет проверять все символы в строке, а не пропуская до следующей строки. Третий случай («else») будет соответствовать строке, которая начинается с некоторого символа, который не является «R» ([^ R]) или начинается с «R», за которым следует символ, который не является «1» или « 2 '(R [^ 12]). Два разных значения ^ несколько сбивают с толку, но эта ошибка была допущена давно и не будет изменена в ближайшее время.
Чтобы использовать дополнительные регулярные выражения, они действительно должны быть привязаны, так как в противном случае [^ R] будет соответствовать, например, 1 после него. Для очень простых регулярных выражений, таких как у вас, этот подход может быть полезен, но по мере усложнения регулярных выражений этот подход станет неуправляемым. Вместо этого вы можете использовать переменные состояния для каждой строки, например так:
Это устанавливает обработанный ноль для каждой новой строки, затем 1, если он совпадает с любым из двух регулярных выражений, и, наконец, если он все еще равен нулю, выполняет печать $ 0.
источник
rfile
просто 10000 строк набора данных спрашивающего.if (!handled)
Тьфу! Используйте,next
чтобы перестать рассматривать другие действия.if (!handled)
. Общие, гибкие, многоразовые решения хороши. Что если следующий человек, у которого возникнет этот вопрос, захочет провести дополнительную обработку после печати? Ответы сnext
не поддерживают это.