텍스트 파일을 필터링하고 싶습니다.오직각 열이 유효한 부동 소수점 숫자인 행을 인쇄합니다. 예를 들어:
3 6 2 -4.2 21.2
3 x 4.2 21.2
3 2 2.2.2
첫 번째 줄만 유효한 부동 소수점 숫자 x
로 전달됩니다 . 단순히 2.2.2
각 섹션에서 청크를 .splits()
실행하는 Python 스크립트를 작성할 수 있지만 try/except
파일이 크면 속도가 느려집니다. 입력 파일에 알 수 없는 수의 가변 길이 열이 있으며 과학적 표기법을 사용하지 않습니다. awk
해결책이 있나요 ?
답변1
awk '
# skip any obvious stuff
/[^0-9. -]/ {next}
{
# test each field for a number
for (i=1; i<=NF; i++)
if ($i + 0 != $i)
next
print
}
'
이렇게 하면 과학 표기법의 유효 숫자가 구분됩니다.1.2e1 == 12
답변2
언급한 조건에 따라 정규 표현식이 가능할 수도 있습니다. RHEL에서 실행할 다음 GNU awk 스크립트를 얻을 수 있습니다.
awk '{for (i=1; i<=NF; ++i) {if ($i !~ /^[-]?[[:digit:]]+(\.[[:digit:]]+)?$/) break;if (i == NF)print($0)}}' file.txt
답변3
다음과 같이 시도해 보세요.
$ cat data.txt
3 6 2 -4.2 21.2
3 x 4.2 21.2
3 2 2.2.2
$ awk '/^\s*(-?[0-9]+(\.[0-9]*)?\s+)+\s*$/ { print }' < data.txt
3 6 2 -4.2 21.2