输入文件:
11 message1(num:1;name:"ee";job:aaffdfd);
12 message2(category:"dds";num:2;name:"Dfdsf");输出:
11,1,ee,aaffdfd,"message1(num:1;name:"ee";job:aaffdfd)"
12,2,Dfdsf,0,"message2(category:"dds";num:2;name:"Dfds这就是我试过的
awk '{print $1}' all.txt > out1
awk '{ printf("\""); for (i = 2; i <= NF; i++) { printf("%s ", $i); } printf("\"\n") }' all.txt > out2
awk -F'name:"|";' '{print $2}' all.txt > out3
awk -F".*job:|;|)" '/classtype:/{print $2;next}{print 0}' all.txt > out4
awk -F".*num:|;|)" '{print $2}' all.txt > out5
paste out1 out2 out3 out4 out5 > final 输出文件的列应以下列方式显示:
目前,我使用不同的awk命令将所有字段分别提取到不同的文件中,然后使用粘贴命令合并所有文件。是否可以使用单一的awk命令或以更优化的方式进行操作?
发布于 2015-04-29 09:57:10
这并不好看,但有一种方法可以使用GNU awk实现您想要的输出:
$ awk -v OFS=, '{sub(/;$/,""); print $1,
gensub(/.*num:([0-9]+).*/,"\\1",1),
gensub(/.*name:"([^"]+).*/,"\\1",1),
(/job/?gensub(/.*job:([^;)]+).*/,"\\1",1):0),
"\""$2"\""}' file
11,1,ee,aaffdfd,"message1(num:1;name:"ee";job:aaffdfd)"
12,2,Dfdsf,0,"message2(category:"dds";num:2;name:"Dfdsf")"输出字段分隔符OFS设置为逗号。sub从每一行的末尾删除分号。gensub在这里用于提取您感兴趣的行的部分。它返回每个替换的结果。如果行上没有匹配的0,则使用三元运算符来添加/job:/。使用默认字段分隔符,$2包含第一个数字之后的所有内容。
发布于 2015-04-29 10:33:21
只是使用split和gsub来达到您的结果。
awk '
{
sec_hash["job"]=0;
second=$2;
gsub(/message[0-9]*\(|\);|"/,"",second);
split(second, sec_array, ";");
for(var in sec_array)
{
split(sec_array[var],key_val_array, ":");
sec_hash[key_val_array[1]]=key_val_array[2];
}
print $1 "," sec_hash["num"] "," sec_hash["name"] "," sec_hash["job"] ",\"" $2 "\""
}' inputhttps://stackoverflow.com/questions/29938991
复制相似问题