随机采样保留注释行 header 行
Randomly sample lines retaining commented header lines
我正在尝试从一个(大)文件中随机抽取行,同时始终保留一组 "header lines"。 Header 行始终位于文件的顶部,与其他行不同,它们以 # 开头。
我处理的实际文件格式是 VCF,但我将问题保持为一般性
要求:
- 输出所有 header 行(由行开头的 # 标识)
- 命令/脚本应该(可以选择)从 STDIN 读取
- 命令/脚本应该输出到 STDOUT
例如,考虑以下示例文件 (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
我正在尝试从一个(大)文件中随机抽取行,同时始终保留一组 "header lines"。 Header 行始终位于文件的顶部,与其他行不同,它们以 # 开头。
我处理的实际文件格式是 VCF,但我将问题保持为一般性
要求:
- 输出所有 header 行(由行开头的 # 标识)
- 命令/脚本应该(可以选择)从 STDIN 读取
- 命令/脚本应该输出到 STDOUT
例如,考虑以下示例文件 (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