如何从文本文件中随机选择500行,但请确保始终包含标题。我的文件看起来像
Col1 Col2
A B
C D
等。第一行是标题。我尝试排序-r filename | head -n 500,但这并不能确保始终包含标头。感谢
答案 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
每次都会为您提供相同的行顺序。