随机采样保留注释行 header 行

Randomly sample lines retaining commented header lines

我正在尝试从一个(大)文件中随机抽取行,同时始终保留一组 "header lines"。 Header 行始终位于文件的顶部,与其他行不同,它们以 # 开头。

我处理的实际文件格式是 VCF,但我将问题保持为一般性

要求:

例如,考虑以下示例文件 (file.in):

#blah de blah
1
2
3
4
5
6
7
8
9
10

示例输出 (file.out) 为:

#blah de blah
10
2
5
3
4

我有一个可行的解决方案(在本例中随机选择 5 non-header 行)使用 bash。它能够从 STDIN 读取(我可以将 file.in 的内容放入命令的其余部分)但是它写入一个命名文件而不是 STDOUT:

cat file.in | tee >(awk ' =~ /^#/' > file.out) | awk ' !~ /^#/' | shuf -n 5 >> file.out

通过使用 process substitution(感谢 Tom Fenech),两个命令都被视为文件。
然后使用 cat 我们可以将这些 "files" 连接在一起并输出到 STDOUT.

cat <(awk '/^#/' file) <(awk '!/^#/' file | shuf -n 10)

输入

#blah de blah
1
2
3
4
5
6
7
8
9
10

输出

#blah de blah
1
9
8
4
7
2
3
10
6
5