【问题标题】:awk: Pattern substitution in one file based on input from another fileawk:基于另一个文件的输入在一个文件中进行模式替换
【发布时间】:2012-03-30 14:27:01
【问题描述】:

我有一个 XML 文件,其中包含一组这样的条目:

<attr name="trajectory" value="nodo2"/>

我想要做的是将文件每个条目中的值字段替换为“nodoX”形式的条目,其中 X 应该从包含数字列表的第二个文件中读取,例如“file2”包含:

4
8
67
52

在这种情况下,我处理过的 XML 文件应该将之前的条目替换为:

<attr name="trajectory" value="nodo4"/>
...
<attr name="trajectory" value="nodo8"/>
...
<attr name="trajectory" value="nodo67"/>
...
<attr name="trajectory" value="nodo52"/>
...

目前我正在尝试使用以下 awk 命令,但它不起作用:

awk '/"trajectory"/ {if (getline < "file2") {x=$1; sub(/"nodo2"/,"\"nodo"x"\"")}}1' $XML_INPUT_FILE > $XML_OUTPUT_FILE

有人可以建议在 awk 中完成这项工作的正确方法吗?

谢谢

丹尼尔

【问题讨论】:

    标签: awk


    【解决方案1】:

    getline &lt; "file2" 覆盖 $0,因此sub 命令不会执行您想要的操作。试试:

    awk '/"trajectory"/ {if (getline x < "file2") {sub(/"nodo2"/,"\"nodo"x"\"")}}1' 
    

    http://www.gnu.org/software/gawk/manual/gawk.html#Getline

    【讨论】:

      【解决方案2】:

      嗯,你可以用awk...

      awk 'BEGIN { c=1 ; while ((getline line < "OTHER_NUMBERS") > 0) { a[c]=line ; c++ } }
           NR == 1 { c=1 }
           /<attr name="trajectory" value="nodo[0-9]+".>/ {
                print gensub("^(.*=.nodo)[0-9]+(.*)","\\1" a[c] "\\2","g",$0)
                c++
           }
           ! /<attr name="trajectory" value="nodo[0-9]+".>/ { print }' XMLFILE
      

      通常它将您的数字文件读入索引数组,然后在每个(匹配的)trajectory 行上打印替换。 注意,如果 numbers 文件中的行数少于 nodo 行数...

      【讨论】:

        【解决方案3】:

        这可能对你有用:

         awk 'FNR==NR{n[++i]=$1;next};/"trajectory"/{sub(/[0-9]+/,n[++j],$3)}1' file2 XML
        

        【讨论】:

          【解决方案4】:

          下面的解决方案

          awk '
          BEGIN{i = 0; while(getline num < "file2"){a[i] = num;i++}}
          /"trajectory"/{sub(/nodo2/,"node"a[NR-1], $0);print $0}' file1
          

          【讨论】:

            猜你喜欢
            • 2023-03-07
            • 2017-05-12
            • 2014-07-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-08
            • 2020-04-14
            • 1970-01-01
            相关资源
            最近更新 更多