在 shell 脚本中使用 grep

在 shell 脚本中使用 grep

我有一个如下所示的文本文件(我显示了其中的几行)

INDEX : 1
snRNA_seq:TTTTGGAGCAGGGAGATGGAAT

miRNA_seq:CTCCTGACTCCAGGTCCTGTGT

target: RNU2-1,RNU2-64P,RNU2-37P,RNU2-61P,RNU2-68P,RNU2-26P,RNU2-57P,RNU2-59P
length: 22
miRNA: hsa-miR-378a-5p*MI0000786
length: 22


mfe: -21.3 kcal/mol

p-value: 0.015469



position  1

target 5'        U             A 3'

                  UUUGGAG CAGGG    

                  GGACCUC GUCCU    

miRNA  3' UGUGUCCU       A     C 5'





INDEX : 10
snRNA_seq:TTGGAGCAGGGAGATGGAAT

miRNA_seq:ATCCTCTCTTCCCTCCTCCCAG

target: RNU2-1,RNU2-64P,RNU2-37P,RNU2-61P,RNU2-68P,RNU2-26P,RNU2-57P,RNU2-59P
length: 20
miRNA: hsa-miR-7111-3p*MI0022962
length: 22


mfe: -24.0 kcal/mol

p-value: 0.001695



position  2

target 5'   U    C        U    A 3'

             GGAG AGGG AGA  GGA    

             CCUC UCCC UCU  CCU    

miRNA  3' GAC    C    U   CU   A 5'

我有标识符列表,即 1,10,20,30 等 上面文件中的该标识符位于 INDEX 部分旁边。我想要做的就是如果标识符与上面的文件匹配,则打印该行+接下来的 28 行基本上是这样的 grep -A 28 "INDEX :identifier"

我怎样才能在外壳中做到这一点?

问候

答案1

当您有您喜欢的标识符的固定条目时,您可以使用

for identifier in 1 10 20 30; do
   grep -A 28 "INDEX : ${identifier}$" Test.txt
done

当您没有固定标识符时,您可以在不指定标识符的情况下执行 grep:

grep -A 28 "^INDEX : " Test.txt

^在这里使用匹配行开头的 INDEX 行。

答案2

您可以grep使用-f

   -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.

但为此你需要identifiers相应地格式化你的文件,例如它应该是:

INDEX : 1
INDEX : 10
..........
INDEX : 100

代替:

1,10....100

如果您使用-asFILE grep将从 so 中读取模式stdin,一种方式是 with awk(也可以使用grepwith-x来匹配整行):

awk -F, '{for (i=1; i<=NF; i++) print "INDEX : "$i}' identifiers | grep -A28 -x -f - file

除非你想使用你最喜欢的工具identifiers就地编辑然后运行:

grep -A28 -x -f identifiers file

答案3

如果您想避免使用给定的固定 ID 子集多次传递数据,这是一种可能的方法(对于示例索引 1、2、10):

sed -n '/INDEX : \(1\|2\|10\)$/,+28p'

相关内容