我的头衔有点混乱,因为我不知道如何用英语表达它。
这是我的问题。我有这样格式化的平面文件:
: 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
编辑:我可能会给出一个简单的示例,但真实文件的字段名称确实不同
晚安,谢谢你
答案 0 :(得分:4)
按空格分割每一行,打印前两列,以及以field[24]:
perl -anE 'say join " ", @F[0,1], grep /^field[24]:/, @F' file
答案 1 :(得分:3)
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
答案 2 :(得分:1)
有些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移动到名称后面的第一列,并附加REMOVE:
: 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"
第三个从REMOVE删除到结尾:
: name1 field2:value1-2 field4:{"Value-1-4"}