각 행에서 부분 문자열을 추출합니다. 이러한 하위 문자열은 "이름=값" 형식에서 쉼표로 구분됩니다.

각 행에서 부분 문자열을 추출합니다. 이러한 하위 문자열은 "이름=값" 형식에서 쉼표로 구분됩니다.

내 파일에 쉼표로 구분된 줄이 있습니다. 열 헤더는 없으며 쉼표로 구분된 "이름=값" 쌍만 있습니다. 다음은 몇 가지 테스트 데이터입니다.

listoffruits,producelist,APPLE=red,BANNANA=yellow,GRAPE=purple,ORANGE=orange,FRUIT=yes,WATERMELON=green
listoffruits,producelist,APPLE=red,BANNANA=yellow,GRAPE=violet,ORANGE=orange,FRUIT=affirmative,WATERMELON=green

결과를 얻기 위해 GRAPE=* 및 FRUIT=* 값을 얻고 싶습니다.

purple yes
violet affirmative

또한 앞으로 더 많은 "열"을 추가할 수 있기를 바랍니다(따라서 항상 포도, 과일은 아니지만 포도, 과일 및 수박).

또 다른 장애물은 기둥이 고정되어 있지 않다는 것입니다. 그래서 수박이 마지막 열이라는 것을 항상 알지 못합니다.

내가 얻은 가장 가까운 것은 @jasonwryan의 것입니다.

awk -v RS="," -F= '/GRAPE/{a=$2}; /FRUIT/{b=$2} END{print a,b"\n"}'

그러나 이것은 다음 대신 "확실히 보라색"이라는 마지막 줄을 출력합니다.

purple yes

violet affirmative

답변1

더 많은 선택. 단순화를 위해 예제 텍스트를 저장했습니다 file.

  1. grep및 PCRE:

    $ grep -oP '(GRAPE|FRUIT)=\K.*?(?=,)' file 
    purple
    yes
    violet
    affirmative
    

    같은 줄에 배치하려면 구문 분석하면 됩니다. 예를 들어

    $ grep -oP '(GRAPE|FRUIT)=\K.*?(?=,)' | paste -d" " - - –  
    purple yes
    violet affirmative
    
  2. sed

    $ sed 's/.*GRAPE=\([^,]*\).*FRUIT=\([^,]*\).*/\1 \2/' file 
    purple yes
    violet affirmative
    

    또는 GNU를 사용하세요.sed

    $ sed -r 's/.*GRAPE=([^,]*).*FRUIT=([^,]*).*/\1 \2/' file 
    purple yes
    violet affirmative
    
  3. $ perl -pne 's/.*GRAPE=([^,]*).*FRUIT=([^,]*).*/\1 \2/' file 
    purple yes
    

    위의 내용은 위의 내용과 약간 유사하다는 것을 알 수 있습니다 sed. :) 또는:

    $ perl -lne '@f=(/(?:(?<=GRAPE=)|(?<=FRUIT=))(.+?),/g); print "@f"' file 
    purple yes
    violet affirmative
    

    이는 ,필드 구분 기호 역할을 하며 모든 필드를 검색합니다.

    $ perl -F, -lane '@r=grep(s/.+?=//, grep(/GRAPE|FRUIT/,@F)); print "@r"' file 
    purple yes
    violet affirmative
    

    이것은 더 짧지만 각 줄에 선행 공백을 추가합니다.

    $ perl -F, -lane 'print grep(s/.+?=/ /, grep(/GRAPE|FRUIT/,@F));' file 
     purple yes
     violet affirmative
    

답변2

awk를 사용하세요:

awk -v RS="," -F= '/GRAPE/||/FRUIT/ {printf "%s ", $2}'

레코드 구분 기호를 개행에서 로 변경하고, ,필드 구분 기호를 공백에서 로 변경한 =다음 패턴이 포함된 줄을 일치시키 GRAPE거나 FRUIT같은 줄에 두 번째로 일치하는 필드를 공백으로 구분하여 인쇄합니다. 결과:

purple yes 

관련 정보