提取包含 0|0,0|1,1|0 和 1|1 的文件

提取包含 0|0,0|1,1|0 和 1|1 的文件

我有一个 csv 文件。它的外观如下:

chr22,  Position ,  A     ,       B ,      C ,   D , E
22   ,  16050115 ,  0|0:404     ,  0     , 0    ,  0  ,    1|1:5
22    ,16050213    ,0|0:403  ,     0    ,  0   ,    0  ,   3|4:6
22 , 16050607  ,    1|0:340     , 1|1:3,  0   ,    0  ,    1|1:3
22   16050737 ,    0|0:402   ,   3|0:4 , 0|7:23 , 0  ,      0 
22 16050783  ,   0|0:404 ,       2|2:5 , 0|1:31 , 1|0:51,   0

0|0:4040|0表示is的计数404,依此类推。我只想提取0|01|0和的值0|1输出1:1 应该是:

chr22, Position, A ,B, C ,D, E
22 ,16050115, 0|0:404 ,0 ,0 ,0 ,1|1:5
22 ,16050213, 0|0:403, 0 ,0, 0, 0
22 ,16050607, 1|0:340, 1|1:3, 0 ,0 ,1|1:3
22 ,16050737, 0|0:402, 0 ,0 ,0, 0
22 ,16050783, 0|0:404 ,0 ,0|1:31 ,1|0:51, 0

我试过了 grep -e '0|0:' -e '1|1:' -e '0|1:' -e '1|1 /path/file.csv好像不行。

答案1

原始命令行

我认为以下命令行将通过跳过“有问题的”行来使用逗号分隔的文件来完成此操作,

grep -v -e ', *[2-9]|' -e '|[2-9]:' file.csv

您可以检查带有颜色的小文件,

grep -v -e ', *[2-9]|' -e '|[2-9]:' file.csv |grep --color '.|.'

以及找到哪些行grep(通过选项在前面的命令行中排除-v),

grep -e ', *[2-9]|' -e '|[2-9]:' file.csv |grep --color '.|.'

以下命令行将使用制表符分隔的文件来执行此操作,

grep -v -e '\t[2-9]|' -e '|[2-9]:' Reddy.tab

或者如果您想要稍微宽松的检查,可以使用以下命令行,

grep -v -e '[2-9]|' -e '|[2-9]:' Reddy.tab file.csv

命令行响应 OP 的评论

我认为下面的命令行将执行OP想要的逗号分隔文件和制表符分隔文件,

sed -e 's/[2-9]|[0-9]:[0-9]*/NA/' -e 's/[0-9]|[2-9]:[0-9]*/NA/' file.csv

答案2

不确定grep这种情况是否有要求,但是使用perl,您可以执行以下操作来删除不需要的项目:

perl -pe 's/, ?[2-9]\d*\|\d+:\d+//g; s/, ?\d+\|[2-9]\d*:\d+//g' /path/to/file.csv

答案3

我会尝试

grep -e '[01]|[01]:' 

其中|需要转义,as0|1表示 0 或 1。

注意

grep -e '0|0:' -e '1|1:' -e '0|1:' -e '1|1:'

匹配相同。

对列进行过滤:

awk -F, '$3 ~/[01]|[01]:/ '

其中$3第三列是。

过滤第3列及以上

awk -F, '{printf "%s,%s",$1,$2 ; 
      for(i=3;i<=NF;i++) 
        if ( $i  ~ /[01]\|[01]:/) 
           printf ",%s",$i ; 
      printf "\n" }' 

可以是一排的。

  • 注意,|在这种情况下,需要进行转义。
  • 另请注意,第一行被过滤掉

    chr22,Position
    22,16050115,0|0:404,1|1:5
    22,16050213,0|0:403
    22,16050607,1|0:340,1|1:3,1|1:3
    22,16050737,0|0:402
    22,16050783,0|0:404,0|1:31,1|0:51
    

相关内容