4

我想使用 awk 随机 80/20 拆分文件。

我已阅读并尝试了在此处找到的选项,其中提出了如下建议:

$ awk -v N=`cat FILE | wc -l` 'rand()<3000/N' FILE

如果您想要随机选择,效果很好。

但是,是否可以更改此 awk 以将一个文件拆分为两个 80/20(或任何其他)比例的文件?

4

1 回答 1

11

用 gawk,你会写

gawk '
    BEGIN {srand()}
    {f = FILENAME (rand() <= 0.8 ? ".80" : ".20"); print > f}
' file

例子:

seq 100 > 100.txt
gawk 'BEGIN {srand()} {f = FILENAME (rand() <= 0.8 ? ".80" : ".20"); print > f}' 100.txt
wc -l 100.txt*
100 100.txt
 23 100.txt.20
 77 100.txt.80
200 total

要确保“20”文件中有 20 行:

$ paste -d $'\034' <(seq $(wc -l < "$file") | sort -R) "$file" \
| awk -F $'\034' -v file="$file" '{
    f = file ($1 <= 20 ? ".20" : ".80")
    print $2 > f
}'

$ wc -l "$file"*
100 testfile
 20 testfile.20
 80 testfile.80
200 total

\034是 ASCIIFS字符,不太可能出现在文本文件中。

sort -R洗牌输入可能不便携。虽然它是在 GNU 和 BSD 中排序的。

于 2013-11-04T17:42:33.503 回答