파일(예: file1)의 "n" 줄을 다른 파일의 "n" 문자열 아래에 있는 다른 파일에 추가하고 싶습니다.

파일(예: file1)의 "n" 줄을 다른 파일의 "n" 문자열 아래에 있는 다른 파일에 추가하고 싶습니다.

파일 1:

This Dog
This Cat
This Duck
This Horse

파일 2:

...
Animal Name
...

AniMal Type
...

AnIMal Class
...

animal Brand
...

나는 다음을 수행하고 싶습니다 :

  • "Animal"(대소문자 무시)의 첫 번째 항목 아래에 파일 1(개)의 라인 1을 추가합니다.
  • 두 번째로 나타나는 "Animal"(대소문자 무시) 아래에 파일 1(고양이)의 라인 2를 추가합니다.
  • 세 번째로 나타나는 "Animal" 아래에 파일 1(This Duck)의 3행을 추가합니다(대소문자 무시).
  • 4번째 "Animal" 항목 아래에 파일 1(말)의 4행을 추가합니다(대소문자 무시).
  • ...

따라서 일반적으로 파일 1의 n번째 줄은 "Animal"의 n번째 발생(대소문자 무시) 아래에 추가되어야 합니다.

그렇다면 "sed"나 "awk" 또는 Linux의 다른 명령을 사용하여 이를 달성하는 방법은 무엇일까요?

답변1

GNU sed 사용:

$ sed '/^animal/IR File1' File2
...
Animal Name
This Dog
...

AniMal Type
This Cat
...

AnIMal Class
This Duck
...

animal Brand
This Horse
...

GNU 확장은 다음과 같습니다:

정규식 일치의 I 수정자는 정규식을 대소문자를 구분하지 않고 일치시키는 GNU 확장입니다.

그리고

R 파일 이름

현재 주기가 끝날 때나 다음 입력 줄을 읽을 때 읽을 파일 이름 줄을 출력 스트림에 대기열에 추가하고 삽입합니다. 파일 이름을 읽을 수 없거나 끝에 도달하면 줄이 추가되지 않으며 오류 표시도 나타나지 않습니다.

답변2

이것솔루션은 다음과 같은 작업을 수행해야 합니다.

awk 'NR==FNR{a[NR]=$0;next};1;tolower($1)=="animal"{print a[++i]}' file1 file2 > file3

NR==FNR{a[NR]=$0;다음}file1 데이터를 배열에 축적하고, 이 단계에서 file2가 처리되지 않도록 다음 입력 줄로 점프합니다.

1file2의 각 입력 줄을 인쇄합니다.

tolower($1)=="동물"{print a[++i]}대소문자를 구분하지 않고 "동물"과 일치하고 해당 배열 항목을 출력하며 배열 인덱스를 미리 증가시킵니다.

답변3

file_1의 끝을 나타내기 위해 .마지막 행 뒤에 하나를 추가하면 됩니다 . 왜냐하면 한 파일이 끝나고 다음 파일이 시작되는 시점을 아는 이러한 다양한 개념 이 IOW 없기 때문입니다 .file_1sedsedFNRawksedPOSIX

기본 아이디어는 동물 이름을 저장한 hold area다음 읽을 시간이 되면 file_2줄바꿈으로 구분된 각 부분을 가져 와서 읽는 동안 hold추가하는 것입니다 . 이 연습은 대소문자를 구분하지 않고 리터럴 문자열을 형성하는 행에서만 작동합니다 .pattern spacedetachholdattach<->detachanimal

sed -e '
   1{
      :file1
         N
      /\n\.$/!bfile1
      s///;h;d
   }

   /^[aA][nN][iI][mM][aA][lL]/!b

   G
   s/\n/&&/2;ta
   b

  :a
   h;s/.*\n\n//;x
   s/\n\n.*//

' file_1 file_2

관련 정보