영어 문자 없이 숫자 값만 있는 csv 파일에서 행을 가져오는 방법은 무엇입니까?

영어 문자 없이 숫자 값만 있는 csv 파일에서 행을 가져오는 방법은 무엇입니까?

숫자만 포함된 CSV 파일에서 행을 가져오고 싶습니다. 내 입력 파일은 다음과 같습니다.

8.1.0,289,,,,,,,,,,,,,,,,
9,260,,,,,,,,,,,,,,,,
10,207,,,,,,,,,,,,,,,,
9,206,,,,,,,,,,,,,,,,
Note,8,,,,,,,,,,,,,,,,
10,194,,,,,,,,,,,,,,,,
8.1.0,184,,,,,,,,,,,,,,,,

, 등과 같은 형식의 숫자를 얻을 수 있어야 합니다 9.9.0.08.1

이를 위해 csvgrepor awk또는 명령을 어떻게 사용할 수 있나요 ? sedCSV 파일에는 두 개의 열이 있습니다. 문자가 포함된 줄은 생략해야 합니다.

답변1

및 를 사용하여 awk모든 필드에 유효한 숫자가 포함되어 있는지 확인하고 빈 필드를 건너뜁니다.

awk -F, '{ for(i=1; i<=NF; i++) if($i+0!=$i && $i!="") next }1' infile

답변2

다음과 같이 명령 을 사용할 수 있습니다 grep.

grep -v "[A-Za-z]" filename > filename.output

테스트는 다음과 같습니다.

# cat zz2
1;2
a,1
2,B
                                                                                                                   
# grep -v "[A-Za-z]" zz2
1;2

빈 줄을 필터링하려면 다음을 사용할 수 있습니다.

grep -v "[A-Za-z]" zz2 | grep -v '^$'

답변3

LC_ALL=C grep -v '[^0123456789,.]' < in.csv > out.csv

이외의 문자가 포함된 줄을 제거합니다 0123456789,.. 를 사용하면 LC_ALL=C모든 바이트 시퀀스가 ​​유효한 문자를 형성하는지 확인합니다. 로케일(다른 로케일은 아닌 경우가 많음) 에서는 로 C바꾸는 것이 안전합니다 .01234567890-9

행이 1개 이상의 십진수로 구성된 0개 이상의 시퀀스로 구성된 -separate 목록 ,으로 구성된 0개 이상의 분리된 필드 시퀀스 가 ​​되도록 요구하는 보다 엄격한 일치를 위해 GNU를 사용하면 다음을 수행할 수 있습니다..grep

LC_ALL=C grep -xP '((\d+(\.\d+)*)?)(,(?1))*' < in.csv > out.csv

또는 POSIX:

number=[0123456789]+
field="($number(\\.$number)*)?"
LC_ALL=C grep -xE "$field(,$field)*" < in.csv > out.csv

답변4

sed명령 d:

sed '/[a-zA-Z]/d' data 

최소한 하나의 문자가 발견되면 모든 줄을 삭제하십시오.

와 함께 awk:

awk '!/[a-zA-Z]/' data

줄 안에 문자가 하나라도 있으면 인쇄하지 마세요.

관련 정보