数値以外のフィールドを含む行の削除

数値以外のフィールドを含む行の削除

このようなファイルがありますが、2番目の列に数字以外の文字を含むすべての行を削除したいと思います。

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 

このバージョンの出力は、小数点を持つ純粋な数字の2番目のフィールドがないという点で、入力例と同じです。

ただし、デフォルトの出力から削除された行数が必要ない場合は、デフォルトのstdoutの代わりにstderrとして印刷できます。 ENDブロックを次に置き換えます。

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

答え2

私はあなたが10進数を意味すると仮定します。この場合、以下を使用できますawk

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

0これは、行全体を印刷する前に数字(同じ結果)であることを確認するために2番目の列に追加しようとします$0

これにより、提供したデータの最初の3行だけが印刷されます。


短くて同等の解決策を提供した@msp9011に感謝します。

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

答え3

合格すると数字、1つ以上の10進数シーケンスを意味します。次のことができます(-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他の種類の数値を含めるには、正規表現を調整できます。

関連情報