Bash 对接下来的5行进行排序,同时对文本文件中匹配的列进行排序

Bash 对接下来的5行进行排序,同时对文本文件中匹配的列进行排序,bash,shell,unix,sed,grep,Bash,Shell,Unix,Sed,Grep,我不熟悉unix和通过unix格式化文本文件。 我在编译时生成的文件中有很长的fortran代码模式 CASE('a') IF(use.eq.1) do something1 ELSE do something2 CASE('e') IF(use.eq.1) do something3 ELSE do something4 CASE ... . . . So on 我在一个switch语句中有200个案例。 有些cases变量是重复的,并且是无序的,就像它们没有一个

我不熟悉unix和通过unix格式化文本文件。 我在编译时生成的文件中有很长的fortran代码模式

CASE('a')
 IF(use.eq.1)
  do something1
 ELSE
   do something2
CASE('e')
 IF(use.eq.1)
  do something3
 ELSE
   do something4
CASE ...
.
.
. So on
我在一个switch语句中有200个案例。 有些cases变量是重复的,并且是无序的,就像它们没有一个接一个地放置一样

我想按字母顺序对所有这些案例进行排序,这样重复的案例就可以组合在一起并合并为一个案例


谁能帮我一下吗?…

Unix只知道一个标准的排序工具,而且命令
sort
。但是,唉,它只对行进行排序,而不是对整个块进行排序

因此,您可能能够做的是(但这是相当骇客的,请注意)如下:

  • 将所有块转换为一行
  • 把一行排序
  • 将所有单行线转换回块

  • 这取决于你的积木看起来是什么样子,可能很容易,也可能很棘手。请写一条更详细的注释,描述您的块结构,以防您认为这种方式适合您,然后我将扩展我的答案。

    Perl解决方案:-您正在寻找吗

    > cat case.txt
    CASE('a')
     IF(use.eq.1)
      do something1
     ELSE
       do something2
    CASE('e')
     IF(use.eq.1)
      do something3
     ELSE
       do something4
    CASE('c')
     IF(use.eq.1)
      do something1
     ELSE
       do something2
    CASE('x')
     IF(use.eq.1)
      do something3
     ELSE
       do something4
    CASE('a')
     IF(use.eq.12)
      do something1
     ELSE
       do something2
    CASE('e')
     IF(use.eq.13)
      do something3
     ELSE
       do something4
    >  perl -ne ' if($.%5!=0) { chomp; print } else { print "\n" } ' case.txt| sort -t\' -k2
    CASE('a') IF(use.eq.12)  do something1 ELSE
    CASE('a') IF(use.eq.1)  do something1 ELSE
    CASE('c') IF(use.eq.1)  do something1 ELSE
    CASE('e') IF(use.eq.13)  do something3 ELSE
    CASE('e') IF(use.eq.1)  do something3 ELSE
    CASE('x') IF(use.eq.1)  do something3 ELSE
    >
    

    请参阅,然后重试。不,GNU awk也进行排序,它可以对整个块进行排序。