任何帮助表示赞赏.
我在"csv"文件中有以下行:
11;juan;planA|2014-06-02|3853157|-,planb|2014-08-15|-|-;11111111
12;andrew;planA|2014-07-20|-|-;22222222
Run Code Online (Sandbox Code Playgroud)
我需要生成以下输出:
帐户= 11
Name=juan
Phone=11111111
Plan=planA
Expire=2014-06-02
used=3853157
free=
Plan=planB
Expire=2014=08-15
used=
free=
Run Code Online (Sandbox Code Playgroud)
帐户= 12
Name=andrew
phone=22222222
Plan=planA
Expire=2014-07-20
used=
free=
Run Code Online (Sandbox Code Playgroud)
我打印前3行的awk脚本非常简单:
BEGIN { FS=";";
}
{
print("account=")$1;
print("name=")$2;
print("phone=")$4;
}
END {
}
Run Code Online (Sandbox Code Playgroud)
所以,我需要一些灯来产生"计划信息"行的逻辑:
我可以将字段$ 3分配给$ 0变量,只为字段3分配一个完整的新行,并将FS(文件分隔符)更改为","以拆分计划.然后再将$ 1分配给$ 0并立即将FS更改为"|" 让字段打印计划行.
我需要知道的是,是否可以在块代码段中更改FS变量.或者我完全错了?
谢谢!
您不需要弄乱字段分隔符,awk通过split在字段上使用来获取类似的功能,例如:
split($3,f3,"|");
Run Code Online (Sandbox Code Playgroud)
以下成绩单显示了这一点:
pax> echo "x1;x2a|x2b|x2c;x3" | awk -F';' '{split($2,arr,"|");print $1" "arr[2]}'
x1 x2b
Run Code Online (Sandbox Code Playgroud)
您的具体情况稍微复杂一些,因为您需要拆分$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];
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
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=
Run Code Online (Sandbox Code Playgroud)