如何在bash中按行将文件随机拆分为三个相等的文件

  • 本文关键字:文件 三个 随机 bash 拆分 awk
  • 更新时间 :
  • 英文 :


我有一行可以将其随机一分为二:

'BEGIN {srand()} {f = FILENAME (rand() <= 0.5 ? ".base" : ".target"); print > f}' file.txt

我需要一个像这样的方法,但要把文件分成三等分。一个混乱的解决方案是将现有脚本拆分为0.3/0.7,并在.5.5中进一步拆分"0.7"部分。但我希望更短的解决方案。

对于近似预期的相等大小(由于基于潜在的随机性,因此没有保证(

$ awk 'BEGIN{srand()} {s=int(rand()*3)+1; print > (FILENAME"."s)}' file

为了完全相等(在四舍五入内(,可以进行

$ awk -v n=3 '{print > FILENAME"."(NR%n + 1)}' file

但是,该文件将在没有任何随机选择行的情况下进行拆分。如果你想要随机选择并保持行的相对顺序,我想最好的解决方案是使用shuf和上面的脚本组合

$ cat -n file | shuf > file.shuf
$ awk -v n=3 '{c=NR%n+1; print | "sort -n | cut -f2 > "FILENAME".c}' file.shuf &&  rm file.shuf

我们将行号添加到原始文件中,这样分割的文件将具有相同的记录顺序。

最新更新