在线多重过滤并重新排序

时间:2013-06-09 21:32:04

标签: linux perl sed awk grep

我的头衔有点混乱,因为我不知道如何用英语表达它。

这是我的问题。我有这样格式化的平面文件:

: 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,但我真的不知道怎么做。我更喜欢使用bashsedawkgrep,但如果我别无选择,我可以处理Perl

编辑:我可能会给出一个简单的示例,但真实文件的字段名称确实不同

晚安,谢谢你

3 个答案:

答案 0 :(得分:4)

按空格分割每一行,打印前两列,以及以field[24]:

开头的列
perl -anE 'say join " ", @F[0,1], grep /^field[24]:/, @F' file

答案 1 :(得分:3)

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

答案 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"}