awk:是否可以在awk脚本中更改块代码中的FS变量?

时间:2014-06-07 06:39:40

标签: variables awk scripting fs

感谢任何帮助。

我在" csv"中有以下几行;文件:

11;juan;planA|2014-06-02|3853157|-,planb|2014-08-15|-|-;11111111

12;andrew;planA|2014-07-20|-|-;22222222

我需要产生以下输出:


帐户= 11

 Name=juan
 Phone=11111111
 Plan=planA
 Expire=2014-06-02
 used=3853157
 free=
 Plan=planB
 Expire=2014=08-15
 used=
 free=

帐户= 12

 Name=andrew
 phone=22222222
 Plan=planA
 Expire=2014-07-20
 used=
 free=

我打印前3行的awk脚本非常简单:

BEGIN { FS=";";
}
{
print("account=")$1;
print("name=")$2;
print("phone=")$4;       

}
END {
}

所以,我需要一些灯来产生"计划信息"行:

我可以将字段$ 3分配给$ 0变量,只为字段3分配一个完整的新行,并将FS(文件分隔符)更改为","分裂计划。然后再将$ 1分配给$ 0并立即将FS更改为" |"让字段打印计划线。

我需要知道的是,是否可以在块代码段中更改FS变量。或者我完全错了吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

您不需要使用字段分隔符,awk通过在字段上使用split来获取类似的功能,例如:

split($3,f3,"|");

以下成绩单显示了这一点:

pax> echo "x1;x2a|x2b|x2c;x3" | awk -F';' '{split($2,arr,"|");print $1" "arr[2]}'
x1 x2b

您的特定案例稍微复杂一些,因为您需要将$3拆分为计划,然后,对于这些计划的每个,拆分以提取四条信息。以下脚本似乎可以正常使用:

BEGIN {FS = ";"}
{
    print "Account="$1;
    print "  Name="$2;
    print "  Phone="$4;
    nplans = split ($3, plans, ",");
    for (i = 1; i <= nplans; i++) {
        split (plans[i], planinfo, "|");
        if (planinfo[3] == "-") {planinfo[3] = ""};
        if (planinfo[4] == "-") {planinfo[4] = ""};
        print "  Plan="planinfo[1];
        print "    Expire="planinfo[2];
        print "    Used="planinfo[3];
        print "    Free="planinfo[4];
    }
}

输出:

Account=11
  Name=juan
  Phone=11111111
  Plan=planA
    Expire=2014-06-02
    Used=3853157
    Free=
  Plan=planb
    Expire=2014-08-15
    Used=
    Free=
Account=12
  Name=andrew
  Phone=22222222
  Plan=planA
    Expire=2014-07-20
    Used=
    Free=

答案 1 :(得分:0)

也许您可以使用正则表达式来分隔字段:

awk -F'[;|,]' '{i=1;
            print "account="$i;i++;
            print "Name="$i;i++;
            print "Phone="$NF;
            while(i < NF){
              print "Plan="$i;i++;
              print "Expire="$i;i++;
              print "used="($i!="-"?$i:"");i++;
              print "free="($i!="-"?$i:"");i++;
            }
            print "";}' input.txt

至少适用于您的样本输入。我假设样本输入中没有空行。

输出:

account=11
Name=juan
Phone=11111111
Plan=planA
Expire=2014-06-02
used=3853157
free=
Plan=planb
Expire=2014-08-15
used=
free=

account=12
Name=andrew
Phone=22222222
Plan=planA
Expire=2014-07-20
used=
free=

输入:

11;juan;planA|2014-06-02|3853157|-,planb|2014-08-15|-|-;11111111
12;andrew;planA|2014-07-20|-|-;22222222