異なるファイルに基づいて同じ場所に改行を導入する

異なるファイルに基づいて同じ場所に改行を導入する

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その前に空白行を印刷します。他の行では正常に印刷されます。

関連情報