随机选择标题完整的行

Ssa*_*ank 1 bash shell

如何从文本文件中随机选择 500 行,但要确保始终包含标题。我的文件看起来像

列 1 列 2

AB

光盘

等等。第一行是标题。我试过 sort -r filename|head -n 500 但这并不能确保总是包含标题。谢谢

gle*_*man 5

我会说

{ IFS= read -r head; echo "$head"; shuf | head -n 500; } < file
Run Code Online (Sandbox Code Playgroud)

经过进一步思考,这可能不是最好的解决方案:它打乱了文件,因此随机选择的行是乱序的。这可能无关紧要

如果确实重要,这里有一个技巧:

sed -n "$({ echo 1; seq $(wc -l <file) | sed 1d | shuf | head -n 500 | sort -n; } | sed 's/$/p/')" file
Run Code Online (Sandbox Code Playgroud)

命令替换打印出一个 sed 程序以从文件中打印 500 条随机行,但它们是按顺序排列的:

  • echo 1 => 总是包含标题
  • seq $(wc -l <file) => 打印文件中从 1 到行数的数字
  • sed 1d => 删除第一行(“1”) - 不想要标题两次
  • shuf => 打乱行号
  • head -n 500 => 拿 500 个
  • sort -n => 按数字对数字进行排序
  • sed 's/$/p/' => 在每行末尾添加一个“p”

然后,外部 sed 程序执行类似的操作

sed -n "1p; 5p; 199p; 201p; ... 4352p" file
Run Code Online (Sandbox Code Playgroud)