我真的不想浪费人们的时间来问这个问题,但是经过2个小时而且我的时间已经用完了,我决定问一下......
基本上我有一个格式为的文件:
word: other words; more words here; last word
word: more words here; last word
(etc) x 100
其他单词/更多单词的出现可以为零或更多。
我的目标是计算次数';'每行发生一次,然后在行的开头打印。
我的逻辑是,使用awk表示';'的正则表达式并在每次发生变量时增加变量,然后打印变量。
目前我有:(顺便说一下,如何将我的代码放入阴影框中?)
awk ' /;/ {n=n+1} {print n " " $0}' a.txt
然而,当awk在下一行中读取时,我的'n'未被重置,我失败了。 当awk移动到下一行时,如何重置n? 我尝试设置v = NR,如果v!= NR然后n = 0,但我无法做到这一点。
我还有一个最后的问题,如何将变量设置为等于正则表达式?
谢谢你,
答案 0 :(得分:3)
浪费我生命中的一分钟比你的一百二十分更好: - )
您可以使用字段分隔符执行此操作:
pax> echo 'word: other words; more words here; last word
word: more words here; last word' | awk 'BEGIN {FS=";"}{print NF"> "$0}'
3> word: other words; more words here; last word
2> word: more words here; last word
基本上,将字段分隔符FS
设置为分号,以便根据需要设置字段数NF
。然后打印出NF
变量以及整行$0
。
您可以通过为每行添加四个空格来获取代码块。当您提出问题时,框右上方会出现橙色问号 - 单击该问号并显示一些菜单驱动的格式帮助。
关于你的上一个问题,增加了你的(转述)评论:
我还有一个最后的问题,如何将变量设置为等于正则表达式?我想设置一个变量等于':'之前的所有文本(所以正则表达式是隔离'word')。
为此,您只需获取第一个字段的副本并对其执行替换即可。我已经对awk
命令进行了多行化处理,因为它们变得越来越复杂,这使它们更容易阅读,但如果您愿意,可以将它们全部放在一行:
pax> echo 'xyzzy: other words; more words here; last word
plugh: more words here; last word' | awk '
BEGIN {FS=";"}
{ xx = $1;
gsub (/:.*/, "", xx);
print NF" ("xx") > "$0
}'
3 (xyzzy) > word1: other words; more words here; last word
2 (plugh) > word2: more words here; last word
gsub (/:.*/, "", xx)
只会将变量:.*
(冒号后跟任何内容)替换为变量xx
。