我的标题有点混乱,因为我不知道如何用好的英语表达它。
这是我的问题。我用这种方式格式化了一个平面文件:
: name1 field1-1: field2:value1-2 field3:"value1-3" field4:{"Value-1-4"}
: name2 field2-1: field2:"value2-2" field4:{"Value-2-4"} field3:Value2-3
: name3 field3-1: field3:{"Value-3-3"} field2:value3-2 field4:value3-4所以您可以看到,它不是一个很好的文件,因为字段没有以相同的顺序出现,它们有时具有不同的值类型,有时会丢失更多的值。原始文件也有5到20个字段长。
最后我想要的是:
: name1 field2:value1-2 field4:{"Value-1-4"}
: name2 field2:"value2-2" field4:{"Value-2-4"}
: name3 field2:value3-2 field4:value3-4因此,我知道我想要的字段,在最后的文件,我知道确切的顺序,我希望他们出现。
我试过
sed "s/(field1:.*)|(field2:.*)/\2\1/g"我知道这不是正确的合成,但这是为了可读性。但它不起作用,因为第一场比赛是唯一匹配发生的,而另一组无法匹配。
我想我想做的是有很多awk是可能的,但我真的不知道我怎么能做到。我真的更喜欢使用bash,sed,awk和grep,但是如果我别无选择,我可以处理一些Perl。
编辑:我可以给出一个简单的例子,但是真正的文件有不同的字段名
晚安,谢谢
发布于 2013-06-09 21:59:40
使用awk的一种方法
Script.awk:
{
split ($0,ary,/ /);
printf "%s %s ", ary[1],ary[2];
for (i=3;i<=length(ary);i++) {
if (ary[i] ~ /^field[2,4]:/) {
printf "%s ",ary[i]
}
}
print ""
}输出:
[jaypal:~/Temp] cat file
: name1 field1-1: field2:value1-2 field3:"value1-3" field4:{"Value-1-4"}
: name2 field2-1: field2:"value2-2" field4:{"Value-2-4"} field3:Value2-3
: name3 field3-1: field3:{"Value-3-3"} field2:value3-2 field4:value3-4
[jaypal:~/Temp] awk -f script.awk file
: name1 field2:value1-2 field4:{"Value-1-4"}
: name2 field2:"value2-2" field4:{"Value-2-4"}
: name3 field2:value3-2 field4:value3-4发布于 2013-06-09 21:42:01
按空格分隔每一行,打印前两列,这些列以field[24]:开头
perl -anE 'say join " ", @F[0,1], grep /^field[24]:/, @F' file发布于 2013-06-09 21:48:10
一些sed:
sed -e 's/^\(: [^ ]*\)\(.*\)\(field4:[^ ]*\)/\1 \3REMOVE \2/' \
-e 's/^\(: [^ ]*\)\(.*\)\(field2:[^ ]*\)/\1 \3 \2/' \
-e 's/REMOVE.*//' input 当输入行为:
: name1 field1-1: field2:value1-2 field3:"value1-3" field4:{"Value-1-4"}第一个表达式将field4移动到名称之后的第一列,并附加删除:
: name1 field4:{"Value-1-4"}REMOVE field1-1: field2:value1-2 field3:"value1-3第二个表达式将field2移动到第一列:
: name1 field2:value1-2 field4:{"Value-1-4"}REMOVE field1-1: field3:"value1-3"第三个从删除到结尾删除:
: name1 field2:value1-2 field4:{"Value-1-4"}https://stackoverflow.com/questions/17014393
复制相似问题