grep awk sed를 사용하여 제목별로 텍스트 파일 병합

grep awk sed를 사용하여 제목별로 텍스트 파일 병합

여러 파일을 하나의 최종 파일로 병합하려고 합니다. 각 파일에는 많은 항목이 있으며 대부분 제목이 겹칩니다. 헤더 아래 두 내용을 병합하고 싶습니다. 두 사전을 결합하는 것을 고려하면 더 의미가 있을 것입니다. 둘 다 단일 단어에 대한 항목을 찾을 수 있지만 각 단어의 정의는 약간 다릅니다. 일부 항목은 한 항목에는 있지만 다른 항목에는 없습니다.

예를 들어, 다음 두 파일을 병합하여 하나의 출력 파일을 생성하고 싶습니다.

파일 1

Entry 1
Green Trees
Entry 3
Orange Fibers

파일 2

Entry 1
Red Trees
Entry 2
Spotted Zebras
Entry 3
Blue Fibers

결과물 파일

Entry 1
Green Trees
Red Trees
Entry 2
Spotted Zebras
Entry 3
Orange Fibers
Blue Fibers

항목 2는 파일 1에는 존재하지 않지만 최종 제품에는 존재합니다. 마찬가지로 각 항목의 내용은 항목 ID가 일치하는 곳마다 병합됩니다.

어떻게 해야 하나요?

편집: 위의 질문은 질문의 단순화된 버전입니다. 다음은 파일의 실제 항목 예입니다.

이것$$$00001항목 제목입니다.

파일 1에서

$$$00001
<b><br>- Original: Α<b><br></b></b>- Transliteration: A<b><br></b></b>- Phonetic: al'-fah<b><br></b></b>-...
$$$00002
<b><br>- Original: script<b><br></b></b>- Translitera...

파일 2에서

$$$00001
<b><br>α<b><br></b></b>a; indeclinable...
$$$00002
<b><br>texts<b><br></b></b>A...

답변1

귀하의 예에 대한 간단한 awk한 줄 솔루션은 다음과 같습니다.

awk '/^Entry/{k=$0;next}{g[k]=g[k]"\n"$0}END{for(k in g)print k g[k]}' file1 file2

awk기본적으로 입력라인은 프로그램에 따라 한줄씩 처리된다는 사실은 아시리라 생각합니다 . 이 특정 awk프로그램은 첫 번째 인수로 지정되며 세 개의 명령문으로 구성됩니다. 하나씩 분석해 보겠습니다.

  • /^Entry/{k=$0;next}방법:처리된 행이 일치하면 /^Entry/이를 변수에 저장 k하고 다음 명령문을 무시하고 다음 루프로 이동합니다.

  • {g[k]=g[k]"\n"$0}전제 조건이 없으므로 항상 실행되며 다음을 의미합니다.g키를 사용하여 사전에 저장된 값을 업데이트합니다 k. 새 값은 이전 값(비어 있을 수 있음) g[k], 캐리지 리턴 문자 "\n"및 현재 줄을 연결한 것이어야 합니다.

  • END{for(k in g)print k g[k]}END모든 입력 라인을 처리한 후에 실행되도록 하는 조건이 있습니다 . 그것은 말한다:의 각 키 g, 즉 입력 파일에 있는 각 헤더에 대해 해당 헤더 아래의 입력 파일에 있는 모든 줄을 연결한 관련 값을 인쇄합니다.

/^Entry/IRL을 사용하려면 올바른 패턴(아마도)으로 바꿔야 합니다 /^\$\$\$/.

관련 정보