随机抽样保留注释标题行的行

时间:2015-06-09 09:57:04

标签: bash random-sample

我正在尝试从(大)文件中随机抽样,同时始终保留一组“标题行”。标题行始终位于文件的顶部,与其他任何行不同,以#开头。

我正在处理的实际文件格式为VCF,但我保留了一般性问题

要求:

  • 输出所有标题行(由#at line start标识)
  • 命令/脚本应该(可以选择)从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

我有一个工作解决方案(在这种情况下,使用bash随机选择5个非标题行)。它能够从STDIN读取(我可以将file.in的内容捕获到命令的其余部分)但是它写入命名文件而不是STDOUT:

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

1 个答案:

答案 0 :(得分:2)

使用process substitution(感谢Tom Fenech),这两个命令都被视为文件 然后使用cat我们可以连接这些"文件"一起输出到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