이와 같은 파일이 있는데 두 번째 열에 숫자가 아닌 문자가 포함된 모든 행을 제거하고 싶습니다.
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
다른 유형의 숫자를 포함하려면 정규식을 조정할 수 있습니다.