我有一个包含 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's
shuf
0..3494-1