从文件的中心排序

时间:2014-12-04 03:56:47

标签: shell sorting awk

我有一个充满随机字符串的文件,如下所示,我想从中间开始和结束文件排序。 如果总线是奇数,我想从中心线开始,然后是中央1,中央+ 1,中央2,中央+ 2。 如果总线数是偶数,我想从总线数/ 2开始,反之亦然。

该文件大约100MB,我正在使用2G内存的VPS上运行。

我可以在unix-like平台下使用工具。我怎么做? 如果有这样的号码序列的名称,请告诉我。 感谢。

-----------------BEFORE
line1
line2
line3
line4
line5
line6
line7
-----------------

-----------------AFTER
line4
line3
line5
line2
line6
line1
line7
-----------------

1 个答案:

答案 0 :(得分:0)

如果输入中有偶数行N,则从行N÷2开始,然后添加+1,-2,+ 3,-4,...以获取序列中的下一个条目。如果N = 8,则序列为4,5,3,6,2,7,1,8。

如果输入中有奇数行N,则以行(N + 1)÷2开始,然后加-1,+ 2,-3,+ 4,...以获取下一个条目顺序。如果N = 7,则序列为4,3,5,2,6,1,7。

这可以在awk中相当简单地实现,方法是将输入行插入数组,然后按照演示的顺序打印它们。


$ cat script.awk
{ line[++N] = $0 }
END {
    if (N > 0)
    {
        j = (-1) ** (N % 2)
        n = int((N + 1) / 2)
        for (i = 1; i <= N; i++)
        {
            print line[n]
            n += j * i
            j = -j
        }
    }
}
$ seq -f "line%.0f" 1 7 | awk -f script.awk
line4
line3
line5
line2
line6
line1
line7
$ seq -f "line%.0f" 1 8 | awk -f script.awk
line4
line5
line3
line6
line2
line7
line1
line8
$