2016-12-15 73 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 
相关问题