내 파일에 쉼표로 구분된 줄이 있습니다. 열 헤더는 없으며 쉼표로 구분된 "이름=값" 쌍만 있습니다. 다음은 몇 가지 테스트 데이터입니다.
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
.
grep
및 PCRE:$ grep -oP '(GRAPE|FRUIT)=\K.*?(?=,)' file purple yes violet affirmative
같은 줄에 배치하려면 구문 분석하면 됩니다. 예를 들어
$ grep -oP '(GRAPE|FRUIT)=\K.*?(?=,)' | paste -d" " - - – purple yes violet affirmative
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
펄
$ 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