나는 awk를 사용하여 다소 구체적인 방식으로 두 개의 텍스트 파일을 병합하려고 합니다. file1에서 두 줄을 취하고 file2에서 단어 세트(그러나 별도의 줄에 있음)를 무한히 번갈아 가며 사용합니다. file2의 단어 그룹은 쉼표로 구분됩니다. 예를 들어:
파일 1
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
파일 2
I was born, the red planet, I am hungry, on Mars
I love frogs, they are so tasty, with gold sun, red ketchup
결과물 파일
A Partridge in a Pear Tree
Two Turtle Doves
I was born
the red planet
I am hungry
on Mars
Three French Hens
Four Calling Birds
I love frogs
they are so tasty
with gold sun
red ketchup
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
세부 사항:
- 출력 파일에서 file1의 2줄마다 File2 필드에서 4줄의 추가 줄이 생성됩니다.
- file1은 내용에 관계없이 두 줄의 커플릿으로 분할됩니다.
- file2의 한 줄에는 4개의 그룹(예: 쉼표 3개)이 있습니다.
- 출력 파일에 쉼표가 없습니다
- file2의 그룹에는 고정된 수의 필드가 있습니다.
- file1과 file2는 임의로 길 수 있습니다.
- file2는 항상 file1보다 작습니다.
쉼표로 구분된 File2 필드는 항상 각 레코드에서 동일한 순서(3,3,3,2)로 나타납니다. 즉, $1 $2 $3, $4 $5 $6, $7 $8 $9, $10 S11
출력 파일에서 다음과 같이 정렬하십시오.
배나무에 자고
산비둘기 두 마리
$1 $2 $3
$4 $5 $6
$7 $8 $9
$10S11
프랑스 암탉 세 마리
네 마리의 지저귀는 새
나는 개구리를 사랑해요
그것들은 맛있다
황금빛 태양과 함께
빨간 토마토 소스
다섯 개의 금반지
거위 여섯 마리가 알을 낳는다
일곱 마리 백조가 헤엄치고 있다
여덟 명의 하녀 착유
춤추는 아홉명의 여인들
텐 로드 점프
일레븐 파이퍼스 파이프
12명의 드러머가 북을 치고 있다
- 한 파일의 끝에 도달했지만 다른 파일에 여전히 데이터가 있는 경우 원하는 동작이 지정되지 않았습니다. 나머지 데이터(file1의)는 변경되지 않고 인쇄됩니다.
어떻게 해야 하나요?
답변1
file1
귀하의 예에서는 다섯 번째 줄을 너무 일찍 배치했다고 생각합니다.
내 말이 맞다면 다음 스니펫을 사용해 보세요.
awk '(NR+1)%2{print $0;getline<"file2";n=split($0,a,", ");if(n>1)for(i in a)print a[i];next}1' file1
산출:
A Partridge in a Pear Tree
Two Turtle Doves
I was born
the red planet
I am hungry
on Mars
Three French Hens
Four Calling Birds
I love frogs
they are so tasty
with gold sun
red ketchup
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
답변2
위의 내 의견 외에도 (원하는 경우)앗스크립트
awk -F', ' '1;!(NR%2)&&(getline <"file2")>0{$1=$1;print}' OFS='\n' file1
어디
1
- 동의어{print $0}
:- 상황=
true
(1
), - 행동지정하지 않은 경우 =
default
(print
), - 인쇄매개변수 없음=
print $0
- 상황=
!(NR%2)
- 짝수 행의 경우:NR
-질소수량오른쪽아야(기록)%
- 2로 나눈 나머지를 계산하고,!
- 결과 반전
&&
- 논리적AND
getline <"file2"
$0
- 에서 라인을 읽어파일 2그리고 그것을 필드로 나누세요.에프생산하다에스분리자는 옵션으로 표시되며 성공하면-F=', '
반환됩니다 .1
$1=$1
- 지원요령산소산출에프생산하다에스eperator: 필드에 대해 뭔가를 해야 합니다. 그렇지 않으면$0
그대로 인쇄됩니다.