숫자만 포함된 CSV 파일에서 행을 가져오고 싶습니다. 내 입력 파일은 다음과 같습니다.
8.1.0,289,,,,,,,,,,,,,,,,
9,260,,,,,,,,,,,,,,,,
10,207,,,,,,,,,,,,,,,,
9,206,,,,,,,,,,,,,,,,
Note,8,,,,,,,,,,,,,,,,
10,194,,,,,,,,,,,,,,,,
8.1.0,184,,,,,,,,,,,,,,,,
, 등과 같은 형식의 숫자를 얻을 수 있어야 합니다 9
.9.0.0
8.1
이를 위해 csvgrep
or awk
또는 명령을 어떻게 사용할 수 있나요 ? sed
CSV 파일에는 두 개의 열이 있습니다. 문자가 포함된 줄은 생략해야 합니다.
답변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
바꾸는 것이 안전합니다 .0123456789
0-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
줄 안에 문자가 하나라도 있으면 인쇄하지 마세요.