한 줄에 여러 일치 항목을 grep/awk/sed하고 그 이후의 정보를 얻을 수 있습니까?

한 줄에 여러 일치 항목을 grep/awk/sed하고 그 이후의 정보를 얻을 수 있습니까?

내가 받는 파일은 외부 소스에서 가져온 것이며, 파일은 정리되지 않았습니다... 그리고 관심 있는 정보도 포함되어 있고 관심 없는 정보도 포함되어 있습니다.

name: myName var1: xxx var2: bbbb
var1: xxx var2: aaaa name: myName
name: myName var1: yyy var2: bbbb
var1: xxx var2: aaaa name: myName
name: myName var1: yyy var2: aaaa
var2: aaaa name: myName var1: xxx 
name: myName var1: zzz var2: bbbb
var2: aaaa name: myName var1: zzz

내가 출력하고 싶은 것은 var1and 에 관련된 값들 뿐이므로 var2정렬되었으므로 이것이 var1첫 번째 것입니다. 이와 같이:

xxx bbbb
xxx aaaa
yyy bbbb
xxx aaaa
yyy aaaa
xxx aaaa
zzz bbbb
zzz aaaa

이것이 가능하다면 어떤 아이디어가 있습니까?

답변1

당신은 이것을 할 수 있습니다 awk:

awk '{
        v1 = v2 = ""
        for (i=1; i<NF; i+=2) {
                if ($i == "var1:") v1 = $(i+1)
                if ($i == "var2:") v2 = $(i+1)
        }
        print v1, v2
     }'

각 행에 대해 모든 홀수 필드( $1, $3및  )를 테스트하여 or  $5인지 확인하고 , 일치하는 경우 값(다음 필드 , 에서 또는 까지  ) 을 or  에 복사합니다 .var1:var2:$(i+1)$2$4$6v1v2

답변2

Perl에서는 키-값 쌍으로 해시를 만듭니다.

$ perl -alnE 'my %h = @F; say "$h{qw(var1:)} $h{qw(var2:)}"' file
xxx bbbb
xxx aaaa
yyy bbbb
xxx aaaa
yyy aaaa
xxx aaaa
zzz bbbb
zzz aaaa

답변3

여러 가지 방법으로 이 작업을 수행할 수 있으며 그 중 두 가지는 다음과 같습니다.

$ perl -lne 'print /(?=.*var1:\h+(\H+))(?=.*var2:(\h+\H+))/' input.file


$ sed -e '
     H;s/.*//;x
     s/.*[[:space:]]var2: \([^[:space:]]\{1,\}\)/\1 &/
     s/.*[[:space:]]var1: \([^[:space:]]\{1,\}\)/\1 &/
     s/ \n.*//
' input.file

의 기능을 사용하면 GNU sed다음과 같이 많은 작업을 단순화할 수 있습니다.

$ sed -Ee ' 
    s/^/\n/
    s/.*\svar2: (\S+)/\1 &/
    s/.*\svar1: (\S+)/\1 &/
    s/ \n.*//
' input.file

산출:

xxx bbbb
xxx aaaa
yyy bbbb
xxx aaaa
yyy aaaa
xxx aaaa
zzz bbbb
zzz aaaa

답변4

dat의 데이터에는 gnu sed를 사용하십시오.

$ sed -E 's/.*var1:\s(\S+).+var2:\s(\S+).*|.*var2:\s(\S+).+var1:\s(\S+).*/\1\4 \2\3/' dat

관련 정보