특정 열의 패턴을 검색하여 전체 행을 출력합니다.

특정 열의 패턴을 검색하여 전체 행을 출력합니다.

저는 HDFS에서 작업 중이며 네 번째 열이 숫자 5로 시작하는 전체 행을 가져오려고 합니다.

100|20151010|K|5001
695|20151010|K|1010
309|20151010|R|5005
410|20151010|K|5001
107|20151010|K|1062
652|20151010|K|5001

따라서 다음과 같이 출력되어야 합니다.

100|20151010|K|5001
309|20151010|R|5005
410|20151010|K|5001
652|20151010|K|5001

답변1

가장 간단한 방법은 아마도 다음과 같습니다 awk.

awk -F'|' '$4~/^5/' file

-F'|'필드 구분 기호를 로 설정합니다 |. $4~/^5/네 번째 필드가 로 시작하면 참입니다 5. 무언가가 true로 평가될 때 기본 작업은 awk현재 줄을 인쇄하는 것이므로 위 스크립트는 원하는 것을 인쇄합니다.

다른 옵션은 다음과 같습니다:

  • 진주

    perl -F'\|' -ane 'print if $F[3]=~/^5/' file
    

    같은 생각입니다. 이 -a스위치는 입력 필드를 perl주어진 값에 따라 -F배열로 분할합니다 @F. 그런 다음 배열(배열 계산은 0부터 시작)의 네 번째 요소(필드)가 로 시작하는지 여부를 인쇄합니다 5.

  • grep

    grep -E  '^([^|]*\|){3}5' file 
    

    정규 표현식은 뒤에 a가 3번, 그 |다음에는 가 없는 문자열과 일치합니다 .|5

  • GNU 또는 BSDsed

    sed -En '/([^|]*\|){3}5/p' file 
    

    -E확장 정규식을 활성화 하고 -n일반 출력을 억제합니다. 정규식은 위와 동일하며 grep마지막 p정규식은 sed정규식과 일치하는 줄만 인쇄합니다.

답변2

그러면 일치하는 모든 줄이 인쇄 되고 줄 끝까지 |5인쇄되지 않습니다 .|

grep '|5[^|]*$' <in >out

답변3

CSV 인식 도구를 사용하여 |포함된 문자 및 개행 필드가 포함된 CSV 파일 문제를 해결하려면 다음 방법을 사용할 수 있습니다 mlr(Miller).

mlr --csv --fs '|' -N filter -S '${4} =~ "^5"' file

이렇게 하면 필드 구분 기호를 사용하여 mlr원시 데이터를 헤더 없는 CSV 파일로 읽을 수 있습니다. 필터 표현식을 적용하여 표현식이 참인 레코드를 추출합니다. 이렇게 하면 데이터 유형 유추를 피하고 데이터를 문자열로 처리합니다(정규 표현식은 일반적으로 문자열에서만 작동하므로).|--csv --fs '|' -N-S

^5이 표현식은 레코드의 네 번째 필드에 대해 정규 표현식과 일치합니다 .

추출된 레코드는 입력과 동일한 필드 구분 기호를 사용하여 CSV 형식으로 재생됩니다.

csvkit 패키지의 도구를 사용하여 동일한 작업을 수행할 수 있지만 출력에 사용자 정의 필드 구분 기호를 사용하도록 지시할 수 없으므로 csvgrep구분 기호를 유지하려면 결과 형식을 다시 지정해야 합니다.csvformat|

csvgrep -d '|' -H -c 4 -r '^5' file | csvformat -K 1 -D '|'

에서 생성된 익명 헤더 줄을 건너뛰는 -K 1옵션입니다 .csvformatcsvgrep

답변4

사용행복하다(이전 Perl_6)

~$ raku -ne '.put if .split("|")[3].starts-with("5");' file

입력 예:

100|20151010|K|5001
695|20151010|K|1010
309|20151010|R|5005
410|20151010|K|5001
107|20151010|K|1062
652|20151010|K|5001

예제 출력:

100|20151010|K|5001
309|20151010|R|5005
410|20151010|K|5001
652|20151010|K|5001

-ne즉, Raku는 n플래그를 사용하여 명령줄에서 입력을 한 줄씩 읽도록 지시받습니다(자동 인쇄가 없음을 의미). 수직 막대 ( 예: 네 번째 열)에 0 인덱스 -rd 요소가 있는 put경우 해당 행은 라인을 벗어난 것입니다 .split|3starts-with("5")

더 복잡한 CSV파일의 경우 Raku Text::CSV모듈을 사용하세요.

https://unix.stackexchange.com/a/705099/227738
https://raku.org

관련 정보