怎样用shell语言去掉指定列值的行。

比如文件内容为:
hhhh gm01 111
xxxxx scaffold 22222
lllllllllll gmo3 44444
我想删除第二列为gm*的行?请求各位大侠帮忙~~

假设你的数据保存在dat,shell中执行下面的命令:
awk '
$2 !~ /gm.*/{
print;
}
' dat

他的意思是 如果某行的第2字段不匹配gm* 那么就输出这一行。追问

如果不匹配gm*也不匹配scaffold呢?

追答

awk '
if (($2 !~ /gm.*/) && ($2 !~ /scaffold/))
{
print;
}
' dat
加上一个判断就行了
不匹配gm*同时不匹配scaffold
记得采纳哈。

追问

真的很感谢你,帮你了我很大忙,但是我在操作的时候除了删除了Gm*的行 也删除了Glycine_*的行,我也不知道怎么回事,我是这样写的cat soybean_22.sam|awk '$3!~/Gm*/{print;}'>>soybean_22.sam

追答

$3!~/Gm*/{print;}'>>soybean_22.sam
你匹配的是第三字段,你确认没错?而且应该是 Gm.* 不是Gm*
awk 正则表达式和 shell通配符,有区别的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-05
awk '{
for(i=1;i<NF;i++)
if(i!=2)
printf("%s%s", $i, FS)
print $NF
}' dat
第2个回答  2019-12-01
假设你的数据保存在dat,shell中执行下面的命令:
awk
'
$2
!~
/gm.*/{
print;
}
'
dat
他的意思是
如果某行的第2字段不匹配gm*
那么就输出这一行。
--------
加上一个判断就行了
awk
'
if
(($2
!~
/gm.*/)
&&
($2
!~
/scaffold/))
{
print;
}
'
dat
不匹配gm*同时不匹配scaffold
记得采纳哈。
相似回答