2

我的标题有点混乱,因为我不知道如何用好的英语表达。

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

: 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一些grepPerl

编辑:我可以举一个简单的例子,但真正的文件有不同的字段名称

晚安,谢谢

4

3 回答 3

4

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

perl -anE 'say join " ", @F[0,1], grep /^field[24]:/, @F' file
于 2013-06-09T21:42:01.133 回答
3

一种方法awk

脚本.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-09T21:59:40.987 回答
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"}
于 2013-06-09T21:48:10.427 回答