숫자가 아닌 필드가 있는 행 삭제

숫자가 아닌 필드가 있는 행 삭제

이와 같은 파일이 있는데 두 번째 열에 숫자가 아닌 문자가 포함된 모든 행을 제거하고 싶습니다.

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 

이 버전의 출력은 소수점이 있는 순수한 숫자 두 번째 필드가 없다는 점에서 예제 입력과 동일합니다.

그런데, 기본 출력에서 ​​삭제된 줄 수를 원하지 않으면 기본 stdout 대신 stderr로 인쇄할 수 있습니다. END 블록을 다음으로 바꾸십시오.

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

답변2

나는 당신이 십진수를 의미한다고 가정합니다. 이 경우 다음을 사용할 수 있습니다 awk.

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

0이는 전체 행을 인쇄하기 전에 숫자(동일한 결과)인지 확인하기 위해 두 번째 열에 추가를 시도합니다 $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다른 유형의 숫자를 포함하려면 정규식을 조정할 수 있습니다.

관련 정보