首页 > 解决方案 > 循环读取文件并使用 shell 将其写入另一个文件

问题描述

我有一个 xml 文件,其中包含以下内容

<SummaryRecordMapping>
<eName>Licensed Original MC TPE EXCESSIVE AUTH</eName>
<jobs>
<job>

<SummaryRecordMapping>
<eName>Licensed Reversal MC TPE EXCESSIVE AUTH</eName>
<jobs>
<job>

我想要像下面这样的输出

<SummaryRecordMapping>
<eName>Licensed Original MC This is New Deep</eName>
<jobs>
<job>

<SummaryRecordMapping>
<eName>Licensed Reversal MC This is New Deep</eName>
<jobs>
<job>

<SummaryRecordMapping>
<eName>Licensed Original MC This is Mayurika</eName>
<jobs>
<job>

<SummaryRecordMapping>
<eName>Licensed Reversal MC This is Mayurika</eName>
<jobs>
<job>

代码

#!/bin/bash
while read whole_line ;
do
name=`echo "$whole_line" | awk '{$1=""; print}'`
LO="<eName>Licensed Original MC ${name}</eName>"
awk -v diff="$LO" '{ if(NR==2) { print diff}
                              else {print $0} } ' southBalanceRecon.xml >>LO.xml

LR="<eName>Licensed Reversal MC ${name}</eName>"
awk -v diff="$LR" '{ if(NR==14) { print diff}
                              else {print $0} } ' LO.xml >> LR.xml
done < file.txt

文件.txt

C71 This is New Deep
C72 This is Mayurika

当我尝试运行我的代码时,我没有得到我上面提到的可能输出。谁能告诉我我的代码有什么问题?

标签: bashshellunixawk

解决方案


问题是您awk在循环内调用。让我们awk做循环。

看看awk中的“NR==FNR”是什么?了解该NR==FNR部分。

awk 'NR==FNR { a[NR]=$0; next }
     {
        $1=""
        for (i=1; i<=length(a); i++)  {
           if (i==2)
              print "<eName>Licensed Original MC" $0 "</eName>";
           else if (i==7)
              print "<eName>Licensed Reversal MC" $0 "</eName>";
           else
              print a[i];
        }
     }' southBalanceRecon.xml file.txt

推荐阅读