여러 구분 기호를 사용하여 두 개의 필드를 행별로 추출합니다.

여러 구분 기호를 사용하여 두 개의 필드를 행별로 추출합니다.

이런 파일이 있어요

field01 field02 field03 field04 definition: field05; measure: field06; weight: field07;
field11 field12 field13 field14 definition: field15; measure: field16; 
field21 field22 field33 definition: field25; weight: field27;
field31 field32 field03 field34 definition: field35; measure: field36; wight: field47;

원하는 출력은 두 번째 필드와 "정의" 뒤의 필드입니다.

field02 field05
field12 field15
field22 field25
field32 field35

구분 기호에는 " ", "정의: " 및 ";"가 포함됩니다.

내가 가장 많이 하는 일은

awk -F'definition:' '{print $2}' file |awk 'split($1, a, ");") {print substr(a[1],-5)}'

그것은 나에게 다음을 제공합니다:

field05;
field15;
field25;
field35;

그러나 그것은 내가 원하는 것이 아닙니다. field05, field15 및 field35의 길이는 서로 다를 수 있습니다.

답변1

이것을 시도해보세요:

awk '
{  
    split($0,temp,"definition: ") #Get everything after "definition: " in temp[2]
    split(temp[2],final,";")      #Get everything between "definition :" and ";" in final[1]
    print $2,final[1]
}' 

요청 시 안감 1개:

awk '{split($0,t,"definition: ");split(t[2],f,";");print $2,f[1]}'

답변2

조금 해키적인 제안:

awk -F'[:;]' '{ print $2,$1 }' file | awk -F' ' '{ print $2, $1 }'

산출

field01 field05
field11 field15
field21 field25
field31 field35

답변3

쇼에 늦었지만 awk재미를 위한 또 다른 솔루션

awk -F'[ ;]' '{f=3; while ($f!~"defin") f++; print $2, $(f+1)}' file1

답변4

다음 명령을 사용해보십시오. 훌륭하게 작동합니다.

awk '{for (i=1;i<=NF;i++){if($i ~ /definition:/){gsub(";","",$(i+1));print $2,$(i+1)}}}' filename

산출

field02 field05
field12 field15
field22 field25
field32 field35

관련 정보