AWK:使用变量作为正则表达式的一部分

时间:2016-09-07 19:27:39

标签: regex bash shell awk

我有一个类似于此的文本文件,其中包含用户名,描述和两个具有德语日期格式的时间范围值:

User###@###Description###@###1. August - 8. August 2016###@###1. September - 7. September 2016

使用###@###分隔符分隔每个字段。我想检查某个字段(例如$ 3)是否包含两个相同的月份名称。如果在此指定字段中有两个月的名称,则应删除第一个月的名称,以便awk的输出为:

User###@###Description###@###1. - 8. August 2016###@###1. - 7. September 2016

然后我有了为我的bash脚本(使用awk命令)创建for循环的想法,它增加i以便从预定义变量中读出月份名称。在这里你可以得到更详细的外观

script.sh:

m1=January; m2=February; m3=March; m4=April; m5=May; m6=June; m7=July; m8=August; m9=September; m10=October; m11=November; m12=December


    awk -F '###@###' '
    {for (i=1;i++;i<=12){ 
    count=0;
    $3 ~ 'm'i {count++};
    if (count == 2){gsub(mi,"" ,$3)}
    }}' Info.txt > Info.tmp 

不幸的是它无法搜索varname mi(如m1,m2,m3等)。

为了搜索具有特定模式的变量来执行某些操作,我需要更改哪些内容?

1 个答案:

答案 0 :(得分:2)

您可以将预定义的名称放在awk脚本中。也许这样的事情。 (快速破解 - 即将退出当天;))

awk -F ... ' BEGIN { m[1]="January"; m[2]="February"; ... } 
            {for(i=1...
             if ( $3 ~ m[i] ) { count++ }
             ...}'

修改:为了未来读者的利益,请点击以下OP的shortText.com链接中的文字:

  

awk -F&#39; ### @ ###&#39; &#39;   BEGIN {M1 =&#34; Januar&#34 ;; M2 =&#34;二月&#34 ;;立方米=&#34;三月&#34 ;; M4 =四月; M5 =日; M6 =六月; M7 =月; M8 =月; M9 =年9月; M10 = 10份; M11 =年11月; M12 =月}   {for(i in m){   计数= 0;   $ 3~(m [i]&#34;。*&#34; m [i]){print ++ count};   if(count == 1){sub(m [i],&#34;&#34;,$ 3)}   }}&#39; Info.txt&gt; Info.tmp