2016-12-15 50 views
1

我有一些我想要進行部分排序的「SQL類型」文件,以便稍後能夠對其進行比較。bash:對文件的某些部分進行排序

CREATE TABLE BBBBBB 
(
    ID bigint NOT NULL 
    NAME varchar(50) 
    CURRENCY varchar(3) 
    SYS_START timestamp NOT NULL 
    SYS_END timestamp NOT NULL 
    TS_ID timestamp NOT NULL 
    EXPORT int 
) 

CREATE TABLE AA 
(
    ID bigint NOT NULL 
    SYS_START timestamp NOT NULL 
    SYS_END timestamp NOT NULL 
    TS_ID timestamp NOT NULL 
    NAME varchar(100) NOT NULL 
) 

我只想將括號內的部分排序。輸出應是這樣的:

CREATE TABLE BBBBBB 
(
    CURRENCY varchar(3) 
    EXPORT int 
    ID bigint NOT NULL 
    NAME varchar(50) 
    SYS_END timestamp NOT NULL 
    SYS_START timestamp NOT NULL 
    TS_ID timestamp NOT NULL 
) 

CREATE TABLE AA 
(
    ID bigint NOT NULL 
    NAME varchar(100) NOT NULL 
    SYS_END timestamp NOT NULL 
    SYS_START timestamp NOT NULL 
    TS_ID timestamp NOT NULL 
) 

我試圖把部分括號插入的sed保持緩衝器和排序,但我沒有走遠......我沒有別的想法,現在。

+0

您希望我們寫下您的程序嗎? – Jdamian

+0

...是的。總有人會爲你寫下代碼。 – Jdamian

回答

0

Perl來拯救!

perl -ne ' 
    $between = /^\(/ .. /^\)/; 
    push @buff, $_ if $between && /^\s/; 
    print "(\n", sort splice(@buff), ")\n" if $between =~ /E/; 
    print unless $between 
    ' -- file.sql 
  • -n逐行讀取輸入行
  • 如果你()之間是在一行的開頭$之間也是如此。
  • 以括號之間的空格開頭的行被推送到緩衝區。
  • 當讀取塊的最後一行時,對緩衝區進行排序,打印和清空。
  • 其他行直接打印。
1

或者gawk

gawk 'BEGIN{PROCINFO["sorted_in"] = "@ind_str_asc"} 
     /^\(/{f=1} 
     /^\)/{f=0 
      for (i in a) 
       print a[i] 
      delete a} 
     f{a[$1]=$0} 
     !f' yourfile 

檢查ideone演示here

docs

「@ind_str_asc」排序按升序排列指數相比 串;這是最基本的排序。 (在內部,數組索引是 總是字符串,所以以 '[2 * 5] = 1' 中的索引爲 「10」 而不是數字 10)

+0

奇怪的是,在我的aix和linux上,排序完成,但不像OP結果。我嘗試不同的額外行動,如asort(i)事件與數組索引上的第一個字段的值,但沒有修改,你的代碼似乎是正確的 – NeronLeVelu

+0

只嘗試** ** ideone **在哪裏工作@NeronLeVelu – klashxx

1

隨着awk

awk 'i {a[l++]=$0} 
    /^\(/ {print; i=1} 
    /^\)/ {n=asort(a); for(k=1; k<=n; k++){print a[k]} i=0; delete a; next} 
    !i' File 
+0

雖然我不明白一塊這 - 它的作品! – koem

+0

簡而言之,邏輯(()和())之間的行被複制到數組'a'中。遇到右括號時),排序該數組並打印內容。變量i用於控制哪些行被打印以及何時(這就是!i部分所做的,如果i = 0,則打印該行)。 –

1

使用Vim的解決方案:

vim -c ":/^(/+1,/^)/sort | /^(/-1 | /^(/+1,/^)/sort | wq" x.txt 
相關問題