команда выполняется, когда шаблонное правило неверно в awk, что не так? - PullRequest
0 голосов
/ 24 июня 2019

Странный феномен awk снова .. (это происходит постоянно :))
У меня есть файл aaa ниже.

[first]
aaa
bbb
[second]
ccc
ddd
eee
[third]
fff
ggg
hhh
iii

Я пытаюсь напечатать номера строк каждого раздела, который начинается с заголовка, заключенного в скобки.Поэтому ниже я написал простой awk-скрипт CntSecLines.awk (он отлаживается, поэтому с некоторыми отпечатками).

 /\[/{print "header found : "; print $keep " : " cnt; keep=$1; cnt=0}
!/\[/{print "header not found"; cnt = cnt+1; print "keep = " $keep;}

Ниже приведен результат исключения для aaa.

ckim@stph45:~/test] awk -f CntSecLines.awk aaa
header found : 
[first] : 
header not found
keep = aaa
header not found
keep = bbb
header found : 
[second] : 2
header not found
keep = ccc
header not found
keep = ddd
header not found
keep = eee
header found : 
[third] : 3
header not found
keep = fff
header not found
keep = ggg
header not found
keep = hhh
header not found
keep = iii

Я намеревался обновлять его только при наличии заголовка раздела.Но почему переменная keep обновляется в каждой строке?когда я печатаю переменную $ keep, мы видим, что она обновляется в каждой строке заголовка без раздела.

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

Это awk, а не bashawk вы не используете $ для получения значения переменной (ну, за исключением, например, для позиционных аргументов $1, $2 ...).

awk '
   /\[/{print "header found : "; print keep " : " cnt; keep=$1; cnt=0}
   !/\[/{print "header not found"; cnt = cnt+1; print "keep = " keep;}
' <<EOF
[first]
aaa
bbb
[second]
ccc
ddd
eee
[third]
fff
ggg
hhh
iii
EOF

выведет:

header found : 
 : 
header not found
keep = [first]
header not found
keep = [first]
header found : 
[first] : 2
header not found
keep = [second]
header not found
keep = [second]
header not found
keep = [second]
header found : 
[second] : 3
header not found
keep = [third]
header not found
keep = [third]
header not found
keep = [third]
header not found
keep = [third]

Проверено на repl .

Я считаю, awk интерпретирует $keep как, например, $ со строкой [blabla], как $"[blabla]", затем "[blabla]" преобразуется из строки в число, что приводит к 0, поэтому $keep интерпретируется как $0, что печатает всю строку.

0 голосов
/ 24 июня 2019

Я интерпретировал ваше требование как «считать строки в каждом разделенном скобками разделе».

$ awk '/^\[.*\]$/ {c=0; print; next} {print ++c, $0}' file
[first]
1 aaa
2 bbb
[second]
1 ccc
2 ddd
3 eee
[third]
1 fff
2 ggg
3 hhh
4 iii
  • /^\[.*\]$/ - если запись начинается с литерала [ иоканчивается литералом ]

  • {c=0; print; next} - установить / сбросить счетчик, распечатать запись, пропустить оставшиеся правила

  • {print ++c, $0} ДляДля записей, не соответствующих первому правилу, выведите предварительно увеличенное число, разделитель полей вывода , и запись $0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...