2014-07-14 108 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因編譯錯誤而中止。 –

相關問題