同じヘッダーを共有するファイルをグループ化してからリンクします。

同じヘッダーを共有するファイルをグループ化してからリンクします。

UbuntuでBashを使用しており、質問は次のとおりです。

.TXT特定のフォルダに数十のファイルがあります。

私が知っている限り、彼らはすべてタイトルを持っています。 (各タイトルが1行にあると思いますが、100%はわかりません。)しかし、同じヘッダーを共有する必要はありません。 5つのファイルには同じヘッダーを含めることができ、他のファイルには独自のヘッダーを含めることができます。

最終的に私が望むのは、同じヘッダーを共有するファイルをリンクすることです。次の質問に対する回答(同じヘッダーで複数のファイルを関連付ける)は同じヘッダーを持つ複数のファイルをリンクする方法について説明していますが、私の場合は、最初に同じヘッダーを共有するファイルをリンクする前にグループ化する必要がありました(そして、そのグループヘッドに最初のファイルのヘッダーのみを保持する必要がありました)。

どんなアイデアでも大歓迎です:)ありがとう!

ベストアンサー1

awk '
  FNR==1{
    if (!($0 in h)){file=h[$0]=i++}
    else{file=h[$0];next}
  }
  {print >> (file)}
' *.txt

awkがファイルの最初の行にある場合:

  • ヘッダー配列にヘッダーが含まれていない場合は、h数値(初期値0)がファイル名に設定され、配列i++のキーに配置されます。$0
  • そうでない場合(ヘッダーがすでに配列にある場合h)、配列からファイル名を取得し、次の行を読みます。

最後に、その行がそのファイルに印刷されます。


しかし、「開いたファイルが多すぎます」または同様のメッセージが表示されます。

GNU awkはこれを防ぐために要求されたときにファイルを開いて閉じることを処理しますが、他のawkではそれをしないかもしれません。その場合は、次に進みます。

awk '
  FNR==1{
    if (!($0 in h)||file!=h[$0]){close(file)}
    if (!($0 in h)){file=h[$0]=i++}
    else{file=h[$0];next}
  }
  {print >> (file)}
' *.txt

速度が遅くなる可能性があることに注意してください。

おすすめ記事