【问题标题】:Reset variable new line awk重置变量换行 awk
【发布时间】:2012-04-13 02:27:45
【问题描述】:

我真的不想浪费人们的时间来问这个,但是在我自己的时间用完 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,但我无法做到这一点。

我还有最后一个问题,如何将变量设置为等于正则表达式?

谢谢大家,

【问题讨论】:

    标签: variables awk reset


    【解决方案1】:

    浪费我生命中的一分钟比浪费你的一百二十分钟要好得多:-)

    您可以只使用字段分隔符来执行此操作:

    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


    您可以通过在每行前加上四个空格来获取代码块。当您提出问题时,框的右上角有一个橙色问号 - 单击它会出现一些菜单驱动的格式帮助。


    关于您的最后一个问题,加上您的(转述)评论:

    我还有最后一个问题,如何将变量设置为等于正则表达式?我想设置一个变量等于“:”之前的所有文本(所以正则表达式是为了隔离“单词”)。

    为此,您只需获取第一个字段的副本并对其执行替换即可。我已经多行了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

    【讨论】:

    • 响应您的最后一点,如果我想设置一个等于正则表达式的变量,然后打印它。正则表达式是 ':' 之前的所有文本(因此正则表达式是隔离 'word)并且想要设置一个等于这个的变量。我会怎么做?
    • 您也可以使用awk -F ';' ... 并删除BEGIN
    猜你喜欢
    • 2014-01-04
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多