저는 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 또는 BSD
sed
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
옵션입니다 .csvformat
csvgrep
답변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
|
3
starts-with("5")
더 복잡한 CSV
파일의 경우 Raku Text::CSV
모듈을 사용하세요.
https://unix.stackexchange.com/a/705099/227738
https://raku.org