Linux의 Grep 및 Cut 명령

Linux의 Grep 및 Cut 명령

많은 양의 데이터가 포함된 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 "

col9csv 파일 헤더에서 열 이름을 변경할 수 있습니다 .


사용 miller:

설치해주세요밀러명령을 실행하는 데 사용됩니다.

mlr --csv filter '$col9 >= 1' input.csv

답변3

노력하다

grep -E "^([^,]+,){8}[1-9][0-9]*(.[1-9]+)?" MyFile.csv

어디

  • -Egrep확장 정규식을 사용하라고 지시합니다.
  • ^줄의 시작
  • [^,]+,쉼표 이외의 항목, 한 번 이상 일치, 쉼표
  • ( ){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    

https://raku.org

관련 정보