一次通过grep过滤和计数?

Ste*_*son 2 grep bash pipe

grep在一组管道命令的末尾使用来过滤文件中的一些行。之后我会想根据剩余的行数做一些算术运算。

例如

chrN="chr1|chr2|chr3|chr4|chr5|chr6|chr7"
otherCommands | grep -Ew $chrN  > $ChIP".bed"
count_pos=`wc -l $ChIP"bed" | awk '{print 1000000/$1}'`
Run Code Online (Sandbox Code Playgroud)

在将大量命令组合在一起然后将其写入文件然后再次读取它只是为了收集一个数字后,这让我感到非常浪费。..但我不知道该怎么做。

所以我的问题是如何将通过 grep 过滤器的行数保存到变量count_pos并将过滤后的行也保存到文件中?

ori*_*ion 6

用 awk 做所有事情。使用模式匹配和最后的输出计数初始化计数器、计数和打印(grep+count):

awk 'BEGIN { c=0} pattern{ c++; print $0 } END{ print 1000000/c }'
Run Code Online (Sandbox Code Playgroud)

如果您不想打印,则不必打印。或者,您可以使用print $0 > output_fileawk 内部在文件中打印 grepped 结果,并依靠标准输出。

  • 这在单个命令中替换了 grep、tee、wc 和 awk。 (2认同)

Gra*_*eme 5

您可以使用 atee写入文件和stdout

chrN="chr1|chr2|chr3|chr4|chr5|chr6|chr7"
count_pos=$(otherCommands |
  grep -Ew "$chrN" |
  tee "$ChIP.bed" |
  wc -l |
  awk '{print 1000000/$1}')
Run Code Online (Sandbox Code Playgroud)