随机选择标题完整的行

时间:2015-03-01 22:46:36

标签: bash shell

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

Col1 Col2

A B

C D

等。第一行是标题。我尝试排序-r filename | head -n 500,但这并不能确保始终包含标头。感谢

2 个答案:

答案 0 :(得分:4)

我说

{ IFS= read -r head; echo "$head"; shuf | head -n 500; } < file

经过进一步反思,这可能不是最佳解决方案:它会随机播放文件,因此随机选择的行无序。这可能无关紧要

如果确实重要,这是一种技巧:

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

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

  • echo 1 =&gt;总是包含标题
  • seq $(wc -l <file) =&gt;将数字从1打印到文件中的行数
  • sed 1d =&gt;删除第一行(&#34; 1&#34;) - 不想要标题两次
  • shuf =&gt;洗牌行号
  • head -n 500 =&gt;拿出500个
  • sort -n =&gt;用数字排序数字
  • sed 's/$/p/' =&gt;添加一个&#34; p&#34;到每一行的末尾

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

的操作
sed -n "1p; 5p; 199p; 201p; ... 4352p" file

答案 1 :(得分:2)

解决方案:

filename=file.txt
lines=500

head -1 $filename
tail -n+2 $filename | shuf | head -n $((lines-1))

<强>解释

此命令仅打印标题:

head -1 $filename

此命令打印除标题之外的所有内容:

tail -n+2 $filename

由于已经打印了一行(标题),因此只剩下500-1行:

head -n $((lines-1))

另外,正如前面提到的,最好使用shuf代替sort -r来重排这些行,因为sort -r每次都会为您提供相同的行顺序。