如何随机对文件进行子集化,然后从多个文件中选择相同的行号

如何随机对文件进行子集化,然后从多个文件中选择相同的行号

我有一个包含 3494 行的文件,我想随机选择其中 100 行,并将这些行写入一个新文件。我可以使用这个来做到这一点:

shuf -n 100 input_file.txt output_file.txt

但是,我有很多这样的输入文件,并且我想从每个文件中选择相同的 100 行。也就是说,我需要保留第一个文件选择的行索引shuf,并在其他文件中选择相同的行。我怎样才能做到这一点?

编辑:

第一个答案很有帮助,但我仍然无法从正确的文件中进行选择。我有 10 个文件,我想从中选择相同的 100 行。我最终得到了 1100 行。

答案1

您可以首先从 3494 中提取 100 个随机数,然后从每个文件中提取这些行号,例如

seq 3494 | shuf -n 100 | awk 'NR==FNR{ z[$0]++;next}
{if (FNR in z){ print >FILENAME"_random"}}' - ./*.txt

这将从每个文件中提取相同的行号并将它们保存到FILENAME"_random"

答案2

您可以创建一个简单的sed脚本文件来打印特定索引处的行,例如

printf '%dp\n' $(shuf -i 1-3494 -n 100) > indexfile

然后像这样使用它

sed -nf indexfile File1
sed -nf indexfile File2
.
.

等等。如果您有 GNU sed-s, --separate您可以使用以下命令从多个文件中顺序选择相同的行

sed -snf indexfile File1 File2 File3

File1 File2 File3如果您愿意,可以用 shell glob 替换)。

如果您想要一个每次调用都选择不同随机子集的单行代码,那么您可以执行类似的操作

printf '%dp\n' $(shuf -i 1-3494 -n 100) | sed -snf - File1 File2 File3

答案3

perl -ls0777ne 'print for(split $\)[split $\,$r]' -- -r="$(shuf -i 0-3493 -n 100)" -- ./*.txt

r="$(shuf -i 0-3493 -n 5)" \
perl -l -0777ne 'print for(split $\)[split $\,$ENV{r}]' ./*.txt

生成随机组合并Perl通过命令行传递,从而确保所有文件获得相同的随机序列。然后通过构造一次性slurped分割并选择每个文件。请注意,由于索引从零开始,因此给出命令newline@A[...]Perl'sshuf0..3494-1

相关内容