对sed中的文本输出进行排序

对sed中的文本输出进行排序,sed,awk,perl,Sed,Awk,Perl,我的案文如下: FLAGS (\Seen \Flagged)) * 1001 FETCH (BODY[HEADER.FIELDS (message-id subject)] {167} Message-ID: ail test 13 Subject: =?utf-8?Q?RDM=20Request=20RD00001578:=20Under=20Review=20->=20Requested?= FLAGS (\Seen \Flagged)) * 1010 FETCH (BODY[H

我的案文如下:

 FLAGS (\Seen \Flagged))
* 1001 FETCH (BODY[HEADER.FIELDS (message-id subject)] {167}
Message-ID: ail test 13
Subject: =?utf-8?Q?RDM=20Request=20RD00001578:=20Under=20Review=20->=20Requested?=

 FLAGS (\Seen \Flagged))
* 1010 FETCH (BODY[HEADER.FIELDS (message-id subject)] {145}
Subject: RE: ail test 12
Message-ID: <81B1DDBBD5E5D148915DBDF77378184D1036F5CD1B@xxxxxxxxxxxxxxxxxxxxxxxxx>


 FLAGS (\Seen \Flagged))
* 1020 FETCH (BODY[HEADER.FIELDS (message-id subject)] {116}
Subject: RE: ail test 14
Message-ID: <8A20A6EF23B11D41A1B3222195A1B2683AD3D013@xxxxxxxxxxxxxxxxxxxxxxxxx>
我知道如何获取字段,我的主要问题是将所需的顺序设置为主题必须始终位于message-id的第一位

编辑:

S.O.is(uname-a)SunOS服务器名5.9通用_122300-61 sun4u sparc SUNW,Sun-Fire-15000按顺序打印值:

$ awk '/^Subject:/{s=$0}/^Message-ID:/{m=$0}s&&m{print s"\n"m"\n";s=0;m=0}' file
Subject: =?utf-8?Q?RDM=20Request=20RD00001578:=20Under=20Review=20->=20Request...
Message-ID: ail test 13

Subject: RE: ail test 12
Message-ID: <81B1DDBBD5E5D148915DBDF77378184D1036F5CD1B@xxxxxxxxxxxxxxxxxxxxxx...

Subject: RE: ail test 14
Message-ID: <8A20A6EF23B11D41A1B3222195A1B2683AD3D013@xxxxxxxxxxxxxxxxxxxxxxxxx>
$awk'/^Subject:/{s=$0}/^Message ID:/{m=$0}s&&m{print s\n“m”\n;s=0;m=0}文件
主题:=?utf-8?Q?RDM=20请求=20RD00001578:=20Under=20Review=20->=20Request。。。
消息ID:ail test 13
主题:回复:所有测试12
消息ID:按顺序打印值:

$ awk '/^Subject:/{s=$0}/^Message-ID:/{m=$0}s&&m{print s"\n"m"\n";s=0;m=0}' file
Subject: =?utf-8?Q?RDM=20Request=20RD00001578:=20Under=20Review=20->=20Request...
Message-ID: ail test 13

Subject: RE: ail test 12
Message-ID: <81B1DDBBD5E5D148915DBDF77378184D1036F5CD1B@xxxxxxxxxxxxxxxxxxxxxx...

Subject: RE: ail test 14
Message-ID: <8A20A6EF23B11D41A1B3222195A1B2683AD3D013@xxxxxxxxxxxxxxxxxxxxxxxxx>
$awk'/^Subject:/{s=$0}/^Message ID:/{m=$0}s&&m{print s\n“m”\n;s=0;m=0}文件
主题:=?utf-8?Q?RDM=20请求=20RD00001578:=20Under=20Review=20->=20Request。。。
消息ID:ail test 13
主题:回复:所有测试12
消息ID:在段落模式下使用(
-00
):

输出

主题:=?utf-8?Q?RDM=20请求=20RD00001578:=20Under=20Review=20->=20请求=
消息ID:ail test 13
主题:回复:所有测试12
消息ID:
主题:回复:所有测试14
消息ID:

发件人:

-0[八进制/十六进制]

将输入记录分隔符($/)指定为八进制或十六进制数字。
特殊值00将导致Perl以段落模式读取文件。任何0400或更高的值都会导致Perl将文件完整地存储起来,但按照惯例,值0777通常用于此目的

在段落模式下使用(
-00
):

输出

主题:=?utf-8?Q?RDM=20请求=20RD00001578:=20Under=20Review=20->=20请求=
消息ID:ail test 13
主题:回复:所有测试12
消息ID:
主题:回复:所有测试14
消息ID:

发件人:

-0[八进制/十六进制]

将输入记录分隔符($/)指定为八进制或十六进制数字。
特殊值00将导致Perl以段落模式读取文件。任何0400或更高的值都会导致Perl将文件完整地存储起来,但按照惯例,值0777通常用于此目的

使用GNU awk(对于gensub()):

$awk-v RS='{
打印gensub(/.*\n(主题[^\n]+).*/,“\\1”,”)
打印gensub(/.*\n(消息[^\n]+).*/,“\\1”,”)
}"档案"
主题:=?utf-8?Q?RDM=20请求=20RD00001578:=20Under=20Review=20->=20请求=
消息ID:ail test 13
主题:回复:所有测试12
消息ID:
主题:回复:所有测试14
消息ID:
您可以使用match()+substr()或几个sub()代替gensub()在任何awk中执行相同的操作。

使用GNU awk(对于gensub()):

$awk-v RS='{
打印gensub(/.*\n(主题[^\n]+).*/,“\\1”,”)
打印gensub(/.*\n(消息[^\n]+).*/,“\\1”,”)
}"档案"
主题:=?utf-8?Q?RDM=20请求=20RD00001578:=20Under=20Review=20->=20请求=
消息ID:ail test 13
主题:回复:所有测试12
消息ID:
主题:回复:所有测试14
消息ID:

您可以使用match()+substr()或几个sub()代替gensub()在任何awk中执行相同操作。

如果您允许自己多次读取文件,则无需使用
awk的
sed

grep '^Subject:' your_file | paste -d "\n" - <(grep '^Message-ID' your_file)

grep'^Subject:“您的|文件|粘贴-d”\n”-如果允许自己多次阅读该文件,则无需使用
awk的
sed

grep '^Subject:' your_file | paste -d "\n" - <(grep '^Message-ID' your_file)

grep'^Subject:“您的|文件|粘贴-d”\n“-在
sed
中,这有点棘手:

sed -n -e '/^Subject:/H;/^Message-ID:/H' \
    -e 'x' \
    -e '/\nSubject:.*\n.*/{s/^\n//;p;s/.*//}' \
    -e '/\nMessage-ID:.*\n.*/{s/^\n\(.*\)\n\(.*\)/\2\n\1/;p;s/.*//}' \
    -e 'x' \
    your_file
该脚本的思想如下:

  • 将以
    消息ID:
    主题:
    开头的行存储在保留空间中(第1个
    -e
  • 读取记录后,对每行执行#1,我们将在保留空间中有
    \n对象:.*\n.*
    \n消息ID:.*\n.
  • 这样,在保持空间中工作就很容易获得预期的输出

  • sed
    中,这有点棘手:

    sed -n -e '/^Subject:/H;/^Message-ID:/H' \
        -e 'x' \
        -e '/\nSubject:.*\n.*/{s/^\n//;p;s/.*//}' \
        -e '/\nMessage-ID:.*\n.*/{s/^\n\(.*\)\n\(.*\)/\2\n\1/;p;s/.*//}' \
        -e 'x' \
        your_file
    
    该脚本的思想如下:

  • 将以
    消息ID:
    主题:
    开头的行存储在保留空间中(第1个
    -e
  • 读取记录后,对每行执行#1,我们将在保留空间中有
    \n对象:.*\n.*
    \n消息ID:.*\n.
  • 这样,在保持空间中工作就很容易获得预期的输出

  • @sputnik,更新问题:)@sputnik,更新问题:)Awk有效,但现在我面临的问题是将其放在主题/消息ID顺序上。您好,尝试了您的cmmand,但我在第1行附近收到:Awk:语法错误Awk:在第1行附近退出1@Thales您必须有一个混乱的
    awk
    实现。这是使用标准的
    awk
    看看它在这里工作@Thales-你使用的是旧的、坏的awk。请参阅我的其他评论。Awk有效,但现在我面临的问题是如何将其放在主题/消息ID顺序上。您好,尝试了您的cmmand,但我在第1行附近得到:Awk:syntax error Awk:bailing out near line1@Thales您必须有一个混乱的
    awk
    实现。这是使用标准的
    awk
    看看它在这里工作@Thales-你使用的是旧的、坏的awk。请参阅我的另一条评论。“不需要
    awk的
    sed
    ”只需
    grep
    (两次),
    粘贴
    过程替换
    ,可能需要一点
    sed
    !疯狂。“不需要
    awk
    sed
    ”只要
    grep
    (两次),
    粘贴
    过程替换
    ,也许需要一点
    sed
    !疯狂。嗨,Ed,我试过了,但是它返回了:“awk:1行附近的语法错误awk:1行附近的bailing out这意味着您正在使用“old,breaked awk”([/usr]/bin/awk on Solaris)。永远不要使用该awk,因为它,嗯,是旧的和坏的。就像我说的,我发布的解决方案使用GNU awk(gawk)-我强烈建议您使用它,因为它具有任何awk中最有用的功能。是的,我在其他服务器上进行了一些测试后注意到。我在solaris服务器上没有管理员权限来安装新版本的awk so
    grep '^Subject:' your_file | paste -d "\n" - <(grep '^Message-ID' your_file) | sed -e '3,$s/^Subject:/\n&/'
    
    sed -n -e '/^Subject:/H;/^Message-ID:/H' \
        -e 'x' \
        -e '/\nSubject:.*\n.*/{s/^\n//;p;s/.*//}' \
        -e '/\nMessage-ID:.*\n.*/{s/^\n\(.*\)\n\(.*\)/\2\n\1/;p;s/.*//}' \
        -e 'x' \
        your_file