많은 양의 데이터가 포함된 CSV 파일이 있습니다. >=1 값으로 열 9를 잘라낸 다음 grep을 사용하여 완전히 일치하는 행을 표시하고 싶습니다.
샘플 형식:
ABC,XYZ,RTY,CREAM,FRANCE,170019,ST REMY CREME,3035540005229,0.75,1,15,26.99,10
ABC,RDS,XSD,SPICE,NETHERLANDS,390476,THE KINGS GINGER,5010493025621,1.5,1,41,49.95,NA
ABC,RMS,DKS,TABLE WINE RED,CHILE,400176,SANTA ISABELA,63657001349,3,1,12.5,31.99,0
나는 전에 시도했다
grep . Myfile.csv |cut -d"," -f9 | sort |grep -E "^(1*[1-9][2-9]*(\.[2-9]+)?|1+\.[2-9]*[1-9][2-9]*)$"
그러나 모든 열이 포함된 전체 행 대신 9번째 열 값만 표시됩니다.
그리고
grep $(cut -d"," -f9 Myfile.csv | grep -E "^(1*[1-9][2-9]*(\.[2-9]+)?|1+\.[2-9]*[1-9][2-9]*)$") Myfile.csv
어떤 도움이라도 좋을 것입니다.
PS: awk(:-를 사용할 수 없습니다.
답변1
불가능하다는 귀하의 진술에도 불구하고 awk
- 완전성을 위해 :
awk -F',' '$9>=1' input.csv
이는 awk
이를 필드 구분 기호로 처리 ,
하고 필드 9의 값이 1보다 크거나 같은 행만 인쇄하도록 지시합니다.
답변2
사용 csvsql
:
파일 csv 파일이 다음과 같다고 가정해 보겠습니다.
$ cat input.csv
col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12,col13
ABC,XYZ,RTY,CREAM,FRANCE,170019,ST REMY CREME,3035540005229,0.75,1,15,26.99,10
ABC,RDS,XSD,SPICE,NETHERLANDS,390476,THE KINGS GINGER,5010493025621,1.5,1,41,49.95,NA
ABC,RMS,DKS,TABLE WINE RED,CHILE,400176,SANTA ISABELA,63657001349,3,1,12.5,31.99,0
이렇게 하면 됩니다:
<input.csv csvsql --query "select * from stdin where col9 >=1 "
col9
csv 파일 헤더에서 열 이름을 변경할 수 있습니다 .
사용 miller
:
설치해주세요밀러명령을 실행하는 데 사용됩니다.
mlr --csv filter '$col9 >= 1' input.csv
답변3
노력하다
grep -E "^([^,]+,){8}[1-9][0-9]*(.[1-9]+)?" MyFile.csv
어디
-E
grep
확장 정규식을 사용하라고 지시합니다.^
줄의 시작[^,]+,
쉼표 이외의 항목, 한 번 이상 일치, 쉼표( ){8}
8회 반복(후행 쉼표 포함)[1-9][0-9]*(.[1-9]+)?
0이 아닌 선행 도트 부분
반복되는 패턴을 제공해 주신 Daniel Junglas에게 감사드립니다.
답변4
사용행복하다(이전 Perl_6)
raku -ne '.put if .split(",")[8] >= 1;'
입력 예:
ABC,XYZ,RTY,CREAM,FRANCE,170019,ST REMY CREME,3035540005229,0.75,1,15,26.99,10
ABC,RDS,XSD,SPICE,NETHERLANDS,390476,THE KINGS GINGER,5010493025621,1.5,1,41,49.95,NA
ABC,RMS,DKS,TABLE WINE RED,CHILE,400176,SANTA ISABELA,63657001349,3,1,12.5,31.99,0
예제 출력:
ABC,RDS,XSD,SPICE,NETHERLANDS,390476,THE KINGS GINGER,5010493025621,1.5,1,41,49.95,NA
ABC,RMS,DKS,TABLE WINE RED,CHILE,400176,SANTA ISABELA,63657001349,3,1,12.5,31.99,0
간단히 말해서 -ne
명령줄 플래그는 Raku에게 코드를 기다렸다가 자동으로 인쇄하지 않고 한 줄씩 실행하도록 지시합니다. 행별 데이터가 $_
테마 변수에 로드됩니다. 이 .split()
호출은 분할의 약어입니다 $_.split
. 이는 분할이 데이터에 대해 작동함을 의미합니다.
그런 다음 0 인덱스의 8번째 열을 선택 [8]
하고 해당 값이 >= 1
. 인지 테스트합니다. 그렇다면 는 $_
로 put
쓸 수 있지만 $_.put
여기서는 로 축약합니다 .put
. (따라서 조건이 만족되면 $_
입력라인 전체가 종료됩니다.)put
마지막으로, ungrepped 줄을 "비워" 동일한 위치에 일치하는 줄을 남겨 두는 것이 때로는 유용합니다. 다음 Raku 코드는 이 작업을 수행하여 빈 첫 번째 줄을 반환합니다.
~$ raku -ne '.grep(*.split(",")[8] >= 1).put;' file
ABC,RDS,XSD,SPICE,NETHERLANDS,390476,THE KINGS GINGER,5010493025621,1.5,1,41,49.95,NA
ABC,RMS,DKS,TABLE WINE RED,CHILE,400176,SANTA ISABELA,63657001349,3,1,12.5,31.99,0