我有一行可以将其随机一分为二:
'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
我们将行号添加到原始文件中,这样分割的文件将具有相同的记录顺序。