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

이를 달성하기 위해 or 명령 csvgrep을 어떻게 사용할 수 있습니까 ? CSV 파일에는 두 개의 열이 있습니다. 문자가 포함된 줄은 생략해야 합니다.awksed

답변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

,행이 0개 이상의 구분된 필드 시퀀스여야 하는 더 엄격한 일치의 경우 .GNU를 사용하여 1개 이상의 십진수로 구성된 0개 이상의 시퀀스로 구성된 별도의 목록을 포함합니다 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

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

관련 정보