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
이를 달성하기 위해 or 명령 csvgrep
을 어떻게 사용할 수 있습니까 ? CSV 파일에는 두 개의 열이 있습니다. 문자가 포함된 줄은 생략해야 합니다.awk
sed
답변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
,
행이 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
줄 안에 문자가 하나라도 있으면 인쇄하지 마세요.