Мне нужно найти текстовый файл для строки и сделать замену, которая включает число, которое увеличивается с каждым совпадением.gsub issue with awk (gawk)
Строка, которая должна быть «найдена», может быть одним символом, словом или фразой.
Выражение замены не всегда будет таким же (как в моих примерах ниже), но всегда будет содержать число (переменную), которое увеличивается.
Например:
1) У меня есть тестовый файл с именем "data.txt". Файл содержит:
Now is the time
for all good men
to come to the
aid of their party.
2) Я поместил awk-скрипт в файл с именем «cmd.awk». Файл содержит:
/f/ {sub ("f","f(" ++j ")")}1
3) Я использую AWK так:
awk -f cmd.awk data.txt
В этом случае, выход, как ожидается:
Now is the time
f(1)or all good men
to come to the
aid of(2) their party.
Проблема возникает, когда есть больше чем одно совпадение на линии. Например, если бы я искал буквы «я», как:
/i/ {sub ("i","i(" ++j ")")}1
Выход:
Now i(1)s the time
for all good men
to come to the
ai(2)d of their party.
который является неправильным, поскольку он не включает в себя «я» в «время» или "их".
Итак, я попытался «GSUB» вместо «суб», как:
/i/ {gsub ("i","i(" ++j ")")}1
Выход:
Now i(1)s the ti(1)me
for all good men
to come to the
ai(2)d of thei(2)r party.
Теперь это делает замену всех вхождений буквы «я» , но вставленный номер одинаковый для всех совпадений в одной строке.
Желательный результат должен быть:
Now i(1)s the ti(2)me
for all good men
to come to the
ai(3)d of thei(4)r party.
Примечание: Номер не всегда начинается с "1", так что я мог бы использовать AWK так:
awk -f cmd.awk -v j=26 data.txt
Чтобы получить результат:
Now i(27)s the ti(28)me
for all good men
to come to the
ai(29)d of thei(30)r party.
И только чтобы быть ясным, число в замене не всегда будет внутри скобок. И замена не всегда будет включать согласованную строку (на самом деле это было бы довольно редко).
Другая проблема, которую я имею с этим ...
Я хочу использовать (не переменное окружение) AWK-переменной «поиск строки», так что я могу указать это в командной строке AWK ,
Например:
1) Я поместил сценарий AWK в файле с именем "cmd.awk". Файл содержит что-то вроде:
/??a??/ {gsub (a,a "(" ++j ")")}1
2) я хотел бы использовать AWK так:
awk -f cmd.awk -v a=i data.txt
Чтобы получить выход:
Now i(1)s the ti(2)me
for all good men
to come to the
ai(3)d of thei(4)r party.
вопрос здесь, как я представляю переменная «a» в/search/expression?
Мне пришлось поиграть с кавычками, чтобы он работал в командной строке Windows, вот что я придумал: 'awk" BEGIN {FS = \ "i \"; OFS = \ "i \"; k = 0} {для (i = 2; i <= NF; i ++) $ i = \ "(\" ++ k \ ") \" $ i} 1 "" data.txt "'. Можете ли вы немного объяснить, почему в некоторых вариантах использования переменной «i» предшествует «$» («$ i»), а некоторые нет? –
Переменные не используют $ -sign, но поля ($ 1, $ 2, ..) делают и сама запись ($ 0). Но если i = 5, например, тогда $ i означает $ 5. – Scrutinizer
@KevinFegan не используют awk-скрипты в командной строке в Windows, иначе у вас появятся кавычки и другие проблемы. Вместо этого поместите скрипт в файл с именем, скажем, «foo.awk» и запустите его как awk -f foo.awk data.txt. Возможно, вы захотите изучить установку cygwin, чтобы избежать кошмара, который является Windows для сценариев. –