안녕하세요, 저는 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
가정 )awk
mawk
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의 요청에 따르면 이는 더 이상 실행 가능한 접근 방식이 아닌 것 같습니다.