首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个在线和重排序滤波器

多个在线和重排序滤波器
EN

Stack Overflow用户
提问于 2013-06-09 21:32:03
回答 3查看 171关注 0票数 2

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

这是我的问题。我用这种方式格式化了一个平面文件:

代码语言:javascript
复制
: 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个字段长。

最后我想要的是:

代码语言:javascript
复制
: name1 field2:value1-2 field4:{"Value-1-4"}      
: name2 field2:"value2-2" field4:{"Value-2-4"}
: name3 field2:value3-2 field4:value3-4

因此,我知道我想要的字段,在最后的文件,我知道确切的顺序,我希望他们出现。

我试过

代码语言:javascript
复制
sed "s/(field1:.*)|(field2:.*)/\2\1/g"

我知道这不是正确的合成,但这是为了可读性。但它不起作用,因为第一场比赛是唯一匹配发生的,而另一组无法匹配。

我想我想做的是有很多awk是可能的,但我真的不知道我怎么能做到。我真的更喜欢使用bashsedawkgrep,但是如果我别无选择,我可以处理一些Perl

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

晚安,谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-09 21:59:40

使用awk的一种方法

Script.awk:

代码语言:javascript
复制
{
    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 "" 
}

输出:

代码语言:javascript
复制
[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
票数 3
EN

Stack Overflow用户

发布于 2013-06-09 21:42:01

按空格分隔每一行,打印前两列,这些列以field[24]:开头

代码语言:javascript
复制
perl -anE 'say join " ", @F[0,1], grep /^field[24]:/, @F' file
票数 4
EN

Stack Overflow用户

发布于 2013-06-09 21:48:10

一些sed:

代码语言:javascript
复制
sed -e 's/^\(: [^ ]*\)\(.*\)\(field4:[^ ]*\)/\1 \3REMOVE \2/' \
    -e 's/^\(: [^ ]*\)\(.*\)\(field2:[^ ]*\)/\1 \3 \2/'       \
    -e 's/REMOVE.*//' input 

当输入行为:

代码语言:javascript
复制
: name1 field1-1: field2:value1-2 field3:"value1-3"     field4:{"Value-1-4"}

第一个表达式将field4移动到名称之后的第一列,并附加删除:

代码语言:javascript
复制
: name1 field4:{"Value-1-4"}REMOVE  field1-1: field2:value1-2 field3:"value1-3

第二个表达式将field2移动到第一列:

代码语言:javascript
复制
: name1 field2:value1-2 field4:{"Value-1-4"}REMOVE  field1-1:  field3:"value1-3"

第三个从删除到结尾删除:

代码语言:javascript
复制
: name1 field2:value1-2  field4:{"Value-1-4"}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17014393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档