두 개의 파일을 병합합니다: 두 줄, 한 줄의 일부, 두 줄, 한 줄의 일부 등 [닫기]

두 개의 파일을 병합합니다: 두 줄, 한 줄의 일부, 두 줄, 한 줄의 일부 등 [닫기]

안녕하세요, 저는 awk두 개의 텍스트 파일을 다소 구체적인 방법으로 병합하려고 합니다. 두 줄을 file1단어 집합 file2 (그러나 별도의 줄에 있음)에서 번갈아가며 사용하는 것입니다.무기한. 단어 그룹은 file2쉼표로 구분됩니다. 예를 들어:

file1

A Partridge in a Pear Tree
Two Turtle Doves
Three French Hens
Four Calling Birds
Five Gold Rings
Six Geese a-Laying
Seven Swans a-Swimming
Eight Maids a-Milking
Nine Ladies Dancing
Ten Lords a-Leaping
Eleven Pipers Piping
Twelve Drummers Drumming
Once upon a midnight dreary, while I pondered, weak and weary,
Over many a quaint and curious volume of forgotten lore—
While I nodded, nearly napping, suddenly there came a tapping,
As of some one gently rapping, rapping at my chamber door.
“’Tis some visitor,” I muttered, “tapping at my chamber door—
            Only this and nothing more.”

file2

I was born, on Mars, the red planet
I love frogs, they are so tasty, with, ketchup, I am hungry

결과물 파일

A Partridge in a Pear Tree
Two Turtle Doves
I was born
Three French Hens
Four Calling Birds
on Mars
Five Gold Rings
Six Geese a-Laying
the red planet
Seven Swans a-Swimming
Eight Maids a-Milking
I love frogs
Nine Ladies Dancing
Ten Lords a-Leaping
they are so tasty
Eleven Pipers Piping
Twelve Drummers Drumming
with
Once upon a midnight dreary, while I pondered, weak and weary,
Over many a quaint and curious volume of forgotten lore—
ketchup
While I nodded, nearly napping, suddenly there came a tapping,
As of some one gently rapping, rapping at my chamber door.
I am hungry
“’Tis some visitor,” I muttered, “tapping at my chamber door—
            Only this and nothing more.”

세부 사항:

  • file1내용에 관계없이 두 줄의 대련으로 나누어짐
  • in 줄에는 file2그룹이 여러 개 있을 수 있습니다(예: 쉼표 개수 제한 없음).
  • 그룹은 file2단어 수에 제한 없이 포함될 수 있습니다(0??? 포함).
  • file1길이 에는 file2제한이 없습니다.
  • 한 파일의 끝에 도달했지만 다른 파일에 여전히 데이터가 있는 경우 원하는 동작이 지정되지 않았습니다.

어떻게 해야 하나요?

답변1

awk -F ', *' '!skip {for (i = 1; i <= NF; i++) a[++n] = $i; next}
              {print}
              FNR % 2 == 0 && m++ < n {print a[m]}
             ' file2 skip=1 file1

답변2

file2매 2줄마다 쉼표 사이에 문장을 삽입하려는 경우 file1다음 awk스크립트를 시도해 볼 수 있습니다.

 awk -F", *" 'NR==FNR{
                 for(i=1;i<NF+1;i++)
                    a[i]=$i
              } 
              NR>FNR{
                 print; 
                 if(FNR%2==0) 
                     print a[FNR/2]
              }' file2 file1

답변3

놀다ecord eparator (여기서 GNU R또는 최신 버전을 S가정 )awkmawk

awk '{print}!(NR%2){getline <"file2";print}' RS="\n|, " file1

만약 ,있다면파일 1줄에서 더 정확한 버전은 다음과 같습니다.

awk 'BEGIN{r=RS}{print}!(NR%2){RS=r"|, ";getline <"file2";print;RS=r}' file1

수정된 문제는 (휴대용)로 해결할 수 있습니다.

awk '{print};!(NR%2) && (getline <"file2")>0{gsub(", *", "\n");print}' file1

답변4

@oliv의 설명이 정확하다고 가정하면 이 솔루션은 다음을 사용하지 않더라도 작동할 수도 있습니다 awk.

paste -d '\n ' file1 <(sed  's/^/\n/;s/, */\n\n/g' file2) | sed '/^$/d'

반면고쳐 쓰다OP의 요청에 따르면 이는 더 이상 실행 가능한 접근 방식이 아닌 것 같습니다.

관련 정보