删除具有非数字字段的行

删除具有非数字字段的行

我有一个这样的文件,我想删除第二列包含非数字字符的所有行。

AC 14      68123822        68123928       
AC 16      34977639        34990886        
AG 2       162266065       162266181       
AC RS00192.1      415332  415454  
AD RS00228.1      20113   20230   
AC ST00228.1      22673   22791   
AC ME103_ID    190936293       190936410       
AD ME103_ID    190938851       190938969       
AH ME145_ID    147089817       147089932       

有没有办法计算删除的行数?谢谢你!

答案1

$ awk 'BEGIN {count=0};
       NF>1 && $2 ~ /^[[:digit:]]+$/ {print;next};
       {count++};
       END { print "Removed " count " lines." }' input.txt 
AC 14      68123822        68123928
AC 16      34977639        34990886
AG 2       162266065       162266181
Removed 6 lines.

如果小数点没问题,请改用以下内容:

$ awk 'BEGIN {count=0};
       NF>1 && $2 ~ /^[[:digit:]]+(\.[[:digit:]]+)?$/ {print;next};
       {count++};
       END { print "Removed " count " lines." }' input.txt 

该版本的输出与您的示例输入相同,因为没有带小数点的纯数字第二个字段。

顺便说一句,如果您不希望主输出中删除的行数,您可以将其打印到 stderr 而不是默认的 stdout。将 END 块替换为:

END { print "Removed " count " lines." > "/dev/stderr" }

答案2

我假设你指的是十进制数。在这种情况下,您可以使用awk

awk '{ if ($2 == ($2+0)) print $0 }' my_file

这尝试添加0到第二列以检查它是否是数字(结果相同),然后才打印整行 ie $0

这仅打印您提供的数据的前三行。


感谢 @msp9011 提供了一个更短、等效的解决方案:

awk '$2 == ($2+0)' my_file

答案3

如果通过数字,您的意思是一个或多个十进制数字的序列,您可以这样做(此处用于-i就地更新文件):

perl -lani -e '
  BEGIN{$n = 0}
  if ($F[1] =~ /^\d+\z/) {print} else {$n++}
  END {print "$n line(s) were removed"}' your-file

^\d+\z如果您想包含其他类型的数字,您可以调整正则表达式。

相关内容