我有一个 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:404
0|0
表示is的计数404
,依此类推。我只想提取0|0
、1|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