CSV 파일에서 일치하는 패턴만 찾기

CSV 파일에서 일치하는 패턴만 찾기

CSV 파일에서 일치하는 패턴만 인쇄하려고 합니다. 예: 로 시작하는 모든 열 값 35=its value. 감사해요.

CSV 파일:

35=A,D=35,C=129,ff=136
D=35,35=BCD,C=129,ff=136
900035=G,D=35,C=129,ff=136
35=EF,D=35,C=129,ff=136,35=G
36=o,D=35,k=1

산출:

35=A
35=BCD
35=EF
35=G

내가 사용한 명령이 작동하지 않습니다.

sed -n '/35=[A-Z]*?/ s/.*\(35=[A-Z]*?\).*/\1/p' filename

답변1

tr모든 쉼표를 개행 문자로 바꾼 다음 grep문자열로 시작하는 모든 줄을 가져오는 데 사용됩니다 35=.

$  tr ',' '\n' <data.in | grep '^35='
35=A
35=BCD
35=EF
35=G

답변2

일치하는 문자열만 각각 한 줄에 인쇄하는 옵션을 GNU grep지원하려면 이를 사용합니다 .-o

$ grep -oE '\b35=[^,]+' ip.csv 
35=A
35=BCD
35=EF
35=G
  • \b단어 경계이므로 900035일치하지 않습니다.
  • [^,]+하나 이상의 비 ,문자 일치
  • 값에 다음이 포함되지 않은 것으로 가정,


그리고awk

$ awk -F, '{ for(i=1;i<=NF;i++){if($i~/^35=/) print $i} }' ip.csv 
35=A
35=BCD
35=EF
35=G
  • -F,,입력 필드 구분자로 설정
  • for(i=1;i<=NF;i++)모든 필드에 걸쳐 반복
  • if($i~/^35=/)필드가 다음으로 시작하는 경우35=
    • print $i이 필드를 인쇄하세요

비슷하다perl

perl -F, -lane 'foreach (@F){print if /^35=/}' ip.csv 

답변3

펄 사용:

$ perl -lne 'print for /(\b35=[^,]+)/g' filename
35=A
35=BCD
35=EF
35=G

아니면 더 일반적으로/강하게 사용할 수도 있습니다.텍스트::CSV 모듈

$ perl -MText::CSV -lne '
  BEGIN{$p = Text::CSV->new()} 
  print for grep { /^35=/ } $p->fields(), $p->parse($_)
' filename
35=A
35=BCD
35=EF
35=G

답변4

순수 Bash 솔루션:

(                                                  # Use parentheses as scope for IFS
    IFS=$',\n'                                     # Split on both , or \n
    for c in $(</tmp/file.csv)                     # For every column or row
    do
        [[ "$c" =~ ^35= ]] && echo ${line##35=}    # Find ^35= and print while removing ^35=
    done
) # Optionally >/tmp/filtered-output.txt

노트,가독성과 유연성을 위해서만 사용하십시오 - 읽을 수 있는 경우그렇지 않으면 다음 방법을 사용할 수 있습니다.

# Read            | Replace     | Find        | Remove
cat /tmp/file.csv | tr ',' '\n' | grep '^35=' | sed 's/^35=//'

이것이 더 직관적이고 효율적입니다.

입력(/tmp/file.csv):

35=A,D=35,C=129,ff=136
D=35,35=BCD,C=129,ff=136
900035=G,D=35,C=129,ff=136
35=EF,D=35,C=129,ff=136,35=G
36=o,D=35,k=1

산출:

A
BCD
EF
G

관련 정보