我有一个文本文件,其中空行分隔文本块。我想使用 *NIX 命令行工具来洗牌这个文件,同时尊重块结构。换句话说,在输出中我想看到块的改变顺序;块内的行及其顺序保持不变。
输入文件示例:
line 1
line 2
line 10
line 20
line 30
line 100
line 200
输出文件(洗牌后):
line 10
line 20
line 30
line 1
line 2
line 100
line 200
当然,重复运行应该给出不同的块顺序。
文件的第一行总是非空的。没有双空行。文件的最后一行始终为空。
我编写了一个非常简单的 Python 脚本,它读取列表列表中的所有行,将其打乱并输出。我很好奇我是否可以使用标准的 *NIX 工具来做到这一点。
POSIXly,您可以执行以下操作:
也就是说,在每行
<a-random-number-that-changes-with-each-paragraph>
前面加上行号,然后按第一个数字和第二个数字排序,以保持段落中的行顺序并删除那些多余的数字。可能需要通过管道
sed '$d'
删除尾随的空白行。请注意,大多数
awk
实现srand()
使用 unix 纪元时间来播种伪随机数生成器,因此如果在同一秒内运行两次,您可能会得到相同的结果(尽管我很遗憾,但现在在 POSIX 规范中雕刻了一个历史错误)。使用 GNU 工具,这会将段落分成 NUL 分隔的组,将它们打乱,然后删除 NUL:
不使用 NUL 的替代方法
由于并非所有工具都支持 NUL 字符,因此这里有一个替代方法。这在段落中读取,替换
~
换行符,然后随机播放,然后~
在显示结果之前将回转换为换行符:如果您的文本可能包含
~
,则使用文本不包含的另一个字符作为临时行分隔符。使用 perl:
或者作为脚本文件展开: