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つのファイルの同じ場所にスペースを挿入する必要があります。
私が考えた1つの方法は、スペースの場所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
その前に空白行を印刷します。他の行では正常に印刷されます。