我有一个如下所示的文本文件:
train/a/abbey/00000001.jpg 0
...
train/a/abbey/00000999.jpg 0
train/a/abbey/00001000.jpg 0
train/a/airport_terminal/00000001.jpg 1
train/a/airport_terminal/00000002.jpg 1
...
train/c/corn_field/00000354.jpg 40
train/c/corn_field/00000355.jpg 40
train/c/corn_field/00000356.jpg 40
...
train/y/yard/00000998.jpg 99
train/y/yard/00000999.jpg 99
train/y/yard/00001000.jpg 99
每行中的最后一个数字是类别。我有 100 个类别(0 到 99),每个类别包含 1,000 行(因此总共 100 * 1,000 = 100,000 行)。
我想将此文件拆分成两个随机的即一半包含 50 个随机类别,另一半包含其他 50 个类别。
答案1
这个就是这样做的,它随机播放每个章节并从结果中取出“lineswanted”行,最后将其存储在两个半文件中:
#!/bin/bash
lineswanted=300
infile="full"
half1="half1"
half2="half2"
# Build chapterlist 0 1 2 3 ....
chapterlist=""
for (( i=0 ; i<100; i=i+1 )) ; do
chapterlist="$chapterlist $i"
done
# shuffle chapterlist
randomchapterlist="`shuf -e $chapterlist`"
rm -f "$half1" "$half2"
i=0
for chapter in $randomchapterlist ; do
if [ $i -lt 50 ] ; then
egrep ".*\ $chapter\$" "$infile" | shuf | head -n $lineswanted >> "$half1"
else
egrep ".*\ $chapter\$" "$infile" | shuf | head -n $lineswanted >> "$half2"
fi
i=$(( i+1 ));
done
答案2
您可以按照以下步骤完成您的工作:
首先,将此文件拆分为 100 个类别文件:
sed -n '0,99p' file >> 1.txt
第一类。
现在你有 100 个文件:1.txt、2.txt、....、100.txt。每个文件有 1000 行。你可以用以下命令从这些文件中随机选择一行并输入前半部分.txt和第二半.txt:
shuf -n 1 filename
在上述每个步骤中,您都可以使用循环来提高速度。
答案3
这个脚本应该可以做到。在两个半文件中,章节行都按输入文件的方式排序,但章节本身是打乱顺序的。如果你需要的话。我可以扩展脚本来对每个半文件中的章节进行排序,或者在一个文件中对所有章节的行进行打乱顺序。
#!/bin/bash
# Build chapterlist 0 1 2 3 ....
chapterlist=""
for (( i=0 ; i<100; i=i+1 )) ; do
chapterlist="$chapterlist $i"
done
# shuffle chapterlist
randomchapterlist="`shuf -e $chapterlist`"
# "full" is input file
# half1 and half2 are output files
rm -f half1 half2
i=0
for chapter in $randomchapterlist ; do
if [ $i -lt 50 ] ; then
egrep ".*\ $chapter\$" full >> half1
else
egrep ".*\ $chapter\$" full >> half2
fi
i=$(( i+1 ));
done