다른 파일에서 패턴을 일치시키기 전에 파일에서 줄을 읽고 결합하는 방법은 무엇입니까?

다른 파일에서 패턴을 일치시키기 전에 파일에서 줄을 읽고 결합하는 방법은 무엇입니까?

이 도움말은 도움이 되지만 여전히 약간 헤매고 있습니다. 나는 그것의 매우 간단한 형식을 훔칠 것입니다. 다른 파일의 패턴(태그) 앞에 한 파일의 내용을 삽입하는 방법은 무엇입니까?

두 개의 파일이 있습니다.

파일 1

test
test2
test3
test4

파일 2

Numebr of results: 0
Numebr of results: 1

Object Name: 
Object UID: {A42CD268-ommitted}
Class Name: referral
    last_element: false
    referral_info: source 
    referral_obj: Name: ommitted (Table: ommitted)
    scheme_flags: 0
    type: member
Numebr of results: 0
Numebr of results: 0

원하는 최종 결과(파일 3?)

test
Numebr of results: 0
test2
Numebr of results: 1

Object Name: 
Object UID: {A42CD268-ommitted}
Class Name: referral
    last_element: false
    referral_info: source 
    referral_obj: Name: ommitted (Table: ommitted)
    scheme_flags: 0
    type: member
test3
Numebr of results: 0
test4
Numebr of results: 0

file1에서 한 번에 한 줄씩 읽고, "결과 수"의 다음 패턴을 찾고, 첫 번째 일치 항목 위의 file1에 line1을 삽입한 다음, 전체 파일을 순서대로 반복하려고 합니다.

미리 감사드립니다!

답변1

나는 사용하는 것이 좋습니다라인/변수/파일 가져오기형태awk getline

$ awk '/^Numebr of results/ {if (getline line < "file1" > 0) print line} 1' file2
test
Numebr of results: 0
test2
Numebr of results: 1

Object Name:
Object UID: {A42CD268-ommitted}
Class Name: referral
last_element: false
referral_info: source
referral_obj: Name: ommitted (Table: ommitted)
scheme_flags: 0
type: member
test3
Numebr of results: 0
test4
Numebr of results: 0

답변2

$ awk 'NR==FNR{A[NR]=$0;next}{if($0~/^Numebr of results/){i++;print A[i]}}1' file1 file2
test
Numebr of results: 0
test2
Numebr of results: 1

Object Name:
Object UID: {A42CD268-ommitted}
Class Name: referral
    last_element: false
    referral_info: source
    referral_obj: Name: ommitted (Table: ommitted)
    scheme_flags: 0
    type: member
test3
Numebr of results: 0
test4
Numebr of results: 0

답변3

로 수행할 수 있지만 더 적절할 것입니다 sed:awk

에코 "--" | cat 파일 1 - 파일 2 | sed -n '1,/----/{H;d} /Numebr/ {x;s/^\n//;P;s /[^\n]*\n//;x;};

답변4

나는 단순히 파일 설명자를 관리하기 위해 서브쉘을 사용합니다. ("exec 3>&-" 필요 없음)
하위 프로세스에 상속된 파일 설명자
이러한 파일 설명자를 사용하는 경우 각 읽기 작업은 아래의 파일 위치를 이동합니다.
"e" 옵션은 패턴 공간 문자열을 sh의 명령으로 실행합니다.

sh$ ( exec 3< file2; 

  sed -r '
    /^Number of results: [0-9]+/ {
    h
    s#.*#read line <\&3; echo -n "$line"#e
    G
    }
  ' file1; 
)

관련 정보