【问题标题】:sort from the central of file从文件中心排序
【发布时间】:2014-12-04 03:56:46
【问题描述】:

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

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

我可以在类unix平台下使用工具。我怎么做? 请让我知道是否有这种数字序列的名称。 谢谢。

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

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

【问题讨论】:

  • sorted from the middle 怎么样?这句话是什么意思?
  • @EdMorton:我同意不清楚,但我认为排序输出中的第一行是中心行,第 4 行,然后是前面和后面的行 (3, 5),然后在 (2, 6) 的任一侧,最后是 (1, 7)。这是一种不寻常的类型!大概,如果有偶数行,比如 8 行,你会从 (4, 5) 开始,然后是 (3, 6),然后是 (2, 7),和 (1, 8)。
  • @Tienfu:输入总是按升序1、2、3,...?值是否连续(数字之间没有间隙)?您可以使用嵌入在行中的数字,还是必须通过行的初始位置?文件有多大?你能把所有的行都存进内存吗?
  • @JonathanLeffler 是的,看起来你是对的,谢谢!

标签: shell sorting awk


【解决方案1】:

如果输入中有偶数行 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
$ 

【讨论】:

  • 谢谢,我要开始写awk脚本了,就是想知道这样的数列有没有名字。
  • 我没有听说过这样一个序列的名称,但可能有一个。
猜你喜欢
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2015-03-19
相关资源
最近更新 更多