2014-07-14 59 views
0

最好是awk,但其他脚本正常。 ("{{{1"在线结束时用于vim折叠,并且与所需输出无关)。示例中的数据来自联机聊天室,我将其粘贴到文本文件中。使用awk对字符串行的第一行中的字段进行排序

Begin file contents: 
----------------------------------------------- 
/mysql unauth'd user on show processlist, plus db conn error in a site {{{1 

1:05 
Gary 
can you ck belljar20 instance? 

1:06 
Justin looks like reverse dns issue 

----------------------------------------------- 
/mysql pingtimes to db server solved by adding domain to /etc/hosts on db server {{{1 
per internal wiki 
... 

----------------------------------------------- 
/php54 back to php52 with manual fix for https {{{1 
Gary 
can u force mkp44aaa.net to bind to an ip address? 
... 

----------------------------------------------- 
:End file contents 

中的记录,又名块(的不同的行数)开始与一个字“/类别”作为第一行的第一个字,一个开始斜线“/”后,和用端约40破折线。以上,在3块示例中,有两个分类为“/ mysql”,另一个分类为“php54”。

在上面的示例中,我希望输出已被排序,因此两个“/ mysql”类别块在排序后的输出中彼此相邻。

因此,本质上,只是按类别名称对块进行排序。

我已经看到了很多解决方案的组件,但似乎无法找到一个足以让我适应它的点。

+3

你有什么企图? –

+0

不是这个,因为我找不到一个我理解和感受到应用的例子。我有一个awk命令,在每天添加新行后,选择性地应用折叠标记,所以至少得到并尝试。头撞了几个小时。 –

回答

1

如果你可以使用perl

#! /bin/bash 

input=/tmp/file 

perl -n0le ' 
    while (s/(\/\w+(.|\n)*?-+)//m){ 
     $str=$1; $str=~/(\/\w+)/; 
     $h{$1}=[] unless exists $h{$1}; 
     push @{h{$1}},$str; 
    } 
    END{ 
     foreach $key (sort keys %h){ 
      foreach (@{$h{$key}}){ 
       print $_."\n"; 
      } 
     } 
    }' $input 

说明:

有很多东西对那里发生的,首先我们要多线比赛,这就是为什么我们使用-0将输入文件的全部内容放入$_

然后我们要提取我们的模式"(\/\w+(.|\n)*?-+)"创建一个数组的散列,其中键为“/ category”。最后,我们根据该键和打印进行分类。

输出:

bash test.sh 
/aaa 
this is a test 

----------------------------------------------- 
/mysql unauth'd user on show processlist, plus db conn error in a site {{{1 

1:05 
Gary 
can you ck belljar20 instance? 

1:06 
Justin looks like reverse dns issue 

----------------------------------------------- 
/mysql pingtimes to db server solved by adding domain to /etc/hosts on db server {{{1 
per internal wiki 
... 

----------------------------------------------- 
/php54 back to php52 with manual fix for https {{{1 
Gary 
can u force mkp44aaa.net to bind to an ip address? 
... 

----------------------------------------------- 
+0

我收到你在最后看到的错误: –

+0

我找不到你说的错误,哪一个结束? – Tiago

+0

不习惯在这里发布,所以它上次搞砸了。这里是错误:要推送的参数1的类型必须是数组(不是散列片段)在-e行5,靠近“$ str;” 执行-e因编译错误而中止。 –

相关问题