根据模式将 txt 文件分成两半

根据模式将 txt 文件分成两半

我有一个如下所示的文本文件:

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

您可以按照以下步骤完成您的工作:

  1. 首先,将此文件拆分为 100 个类别文件:

    sed -n '0,99p' file >> 1.txt
    

第一类。

  1. 现在你有 100 个文件:1.txt、2.txt、....、100.txt。每个文件有 1000 行。你可以用以下命令从这些文件中随机选择一行并输入前半部分.txt第二半.txt

    shuf -n 1 filename
    
  2. 在上述每个步骤中,您都可以使用循环来提高速度。

答案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

相关内容