awk gsub вопрос

Я использовал awk в прошлом для большого управления файлом и замен. Недавно, я использовал его для замены, поскольку исключая буквой A с рядом символов:

$ awk '{gsub(/A/,"@@@")}1' in.txt >> out.txt

где in.txt содержит строки букв различной длины. (AAA, BBB, CCC, ABABAB и т.д.)

Более позднее редактирование: Я использую версию WSL Ubuntu. Кроме того, я рассмотрел sed, но он не работает что хорошо с файлами крупного текста.

Как я могу использовать gsub для замены всех символов в моем файле с @@@, B с ###, C с %%% и т.д.

Я предполагаю, что это должно быть что-то близко к:

$ awk '{gsub(/A|B|C/,"&123")}1' in.txt > out.txt

Большое спасибо!

Более позднее редактирование: Я использую версию WSL Ubuntu на Win10. Кроме того, я рассмотрел использование sed, но он не работает так хорошо с большими файлами.

1
задан 17 April 2020 в 19:39

1 ответ

Насколько я знаю, awk's gsub не может сделать ничего больше что простая текстовая замена. Вы могли однако использовать повторенные приложения match функционируйте для реализации основанного на хеше поиска с заменой подстроки - что-то как:

awk '
  BEGIN{c["A"]="@@@"; c["B"]="###"; c["C"]="%%%"} 
  {
    while(match($0,/[A-C]/)) {
      $0 = substr($0,1,RSTART-1) c[substr($0,RSTART,1)] substr($0,RSTART+1,length($0)-RSTART)
    }
  }
  1
' in.txt

Напротив, perl's s/patt/repl/g (примерно эквивалентный из awk's gsub) имеет дополнительное e флаг, который позволяет выполнение кода RHS. Таким образом, Вы могли сделать что-то как

perl -pe 'BEGIN{%c = (A => "@@@", B => "###", C => "%%%")} $_ =~ s/[A-C]/$c{$&}/ge' in.txt

который, вероятно, намного ближе к тому, что Вы имели в виду.

0
ответ дан 25 April 2020 в 10:45

Другие вопросы по тегам:

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