3개의 입력 파일이 있는데 모두 동일한 줄 수를 가지고 있습니다. 나는 이 질문을 흥미롭게 만들기 위해 영화 예를 생각해 냈습니다.
file1.txt - 기본적으로 배우 이름이 포함되어 있습니다.
1234|jacknicholson|actor
5678|jacknicholson|director
4321|christianbale|actor
file2.txt - 배우가 포함된 영화.
1234|oneflewovercuckoosnest^asgoodasitgets
5678|theshining
4321|batmanbegins^darkknight
file3.txt - 배우의 거주지.
1234|california
5678|hollywoodstudios
4321|losangeles
다음 조건에 따라 첫 번째 입력 파일을 분할했습니다. 이름이 동일하면 일부 알고리즘을 적용해야 합니다. 명령은 다음과 같습니다.
awk -F '|' 'NR>1 && $2 != prev {print ""} {prev=$2; print}' file1.txt
위의 명령은 내 첫 번째 파일( )을 다음과 같이 만듭니다 file1.txt
.
1234|jacknicholson|actor
5678|jacknicholson|director
4321|christianbale|actor
또한 알고리즘을 적용할 수 있도록 나머지 2개 파일의 동일한 위치에 공백을 삽입해야 합니다.
제가 생각한 한 가지 방법은 공간의 위치를 file1.txt
배열에 저장한 다음 나머지 2개 파일에서 해당 위치를 만나면 공간을 도입하는 것입니다.
답변1
actor의 변경 사항과 동일한 위치에 파일에 빈 줄을 추가하려면 file1.txt
다음을 시도하십시오.
$ awk -F '|' '{save=$0; getline<"file1.txt"} NR>1 && $2!=prev {print ""} {prev=$2; print save}' file2.txt
1234|oneflewovercuckoosnest^asgoodasitgets
5678|theshining
4321|batmanbegins^darkknight
위의 코드는 두 파일을 동시에 읽을 수 있도록 확장되었다는 점을 제외하면 여러분의 코드와 매우 유사합니다. 라인을 읽고 file2.txt
변수에 저장합니다 save
. 그런 다음 에서 읽고 file.txt
코드와 동일한 논리를 사용하는 경우 참가자가 변경되었는지 확인하고 그렇다면 개행을 인쇄합니다. 그런 다음 에서 받은 줄을 인쇄합니다 file2.txt
.
답변2
또 다른 awk
해결책:
$ awk 'FNR==NR{if(!NF){a[FNR]=1}next}a[FNR]{print"\n"$0;next}{print}' file1.txt file2.txt
1234|oneflewovercuckoosnest^asgoodasitgets
5678|theshining
4321|batmanbegins^darkknight
- 읽을 때 행이 비어 있으면
file1.txt
배열에 행 번호를 표시합니다.a
- 를 읽을 때
file2.txt
배열의 빈 줄 번호를 얻고a
그 앞에 빈 줄을 인쇄합니다. 다른 라인의 경우 정상적으로 인쇄됩니다.