n行の後にファイルの内容を並べ替える方法は?

n行の後にファイルの内容を並べ替える方法は?

Linuxでは、sortコマンドを実行してファイルの内容を並べ替えることができますが、私の場合は次のファイル(THANKS.txt)があります。

These people have contributed to OSN Envoy. We always try to keep this list updated and correct. 
If you notice that your name is not listed here, then feel free to contact us.

Ar Rakin
Peter Williamson
David Brook
Bill Natt

このファイルには、ソフトウェアプロジェクトに貢献した人のリストが含まれています。

コマンドを使用して名前をアルファベット順にソートしたいと思います。sortどんなアイデアがありますか?

答え1

そしてawk

awk '
  NR == 1, NF == 0 {
    # print and skip all lines until the first blank
    # one (one where the Number of Fields is 0)
    print; next
  } 

  {print | "sort"} # pass the rest to sort
  ' < file

最初の空白行の代わりに3行目で停止するNF == 0ように変更します。NR == 3

awkandを経たくない場合(そして、この単純なコマンドラインを解釈するsortために追加のシェルを実行したくない場合)、次のことを実行できます。awksort

{
  sed '/[^[:blank:]]/!q'
  sort
} < file

ここでuitsは、空白以外の文字()を含まsed qない最初の行を探します。!3行目をsed 3quitに変更します。q

入力が検索できない場合(パイプからのものなど)、対応する行sed区切り文字の後のファイルにカーソルを保持することはできません。これはsort、読み取った可能性がある追加データが欠落していることを意味しますsed(たとえば、パイプから読み取った場合)。より大きな塊が入ります)。

GNU実装を使用すると、読み過ぎることを避けるために、入力を一度に1バイトずつ読み取るオプションをsed追加できます。-u

答え2

これにより、ソートされた名前のリストが提供されます。

sed '1,/^$/d' <THANKS.txt | sort

パイプは、sed最初の行から最初の空の行まですべての項目を削除し、残りはソートに渡すsortために使用されます。/^$/より簡単な場合は、上記またはこの回答の他のコマンドで正規表現アドレスの代わりに空行の行番号を使用することもできます。

ファイルの初期部分を渡すことができます。

sed '1,/^$/!d' <THANKS.txt

dこのコマンドは、デフォルトでコマンド条件を反転してsed名前リストを抽出する代わりに削除します。

これら2つのコマンドを一緒に使用すると、問題全体を解決し、THANKS-sorted.txt出力ファイルを作成できます。

{ sed '1,/^$/!d' <THANKS.txt; sed '1,/^$/d' <THANKS.txt | sort; } >THANKS-sorted.txt

またはより良い形式を使用してください。

{
    sed '1,/^$/!d' <THANKS.txt
    sed '1,/^$/ d' <THANKS.txt | sort
} >THANKS-sorted.txt

ed編集者と一緒に:

printf '%s\n' '1,/^$/ p' '+,$ w !sort' 'q' | ed -s THANKS.txt >THANKS-sorted.txt

これはed次の編集スクリプトを使用します。

1,/^$/ p
+,$ w !sort
q

この編集スクリプトは、最初の空行まで最初の数行を出力します。その後、空白行の次の行から文書の終わりまでのすべての行を記録して、ソートされたsort名前を出力します。

エディタは最終的にq終了し、最終リダイレクトは結果テキストを作成しますTHANKS-sorted.txt

答え3

headコマンドが閉じられない場合(stdinLinuxではない)、次のことを試してください。

{ head -n2; sort; } < file
These people have contributed to OSN Envoy. We always try to keep this list updated and correct. 
If you notice that your name is not listed here, then feel free to contact us.

Ar Rakin
Bill Natt
David Brook
Peter Williamson

stdinが閉じている場合は、head次のようにしてください。

{ read TMP; echo "$TMP"; read TMP; echo "$TMP"; sort; } < file
These people have contributed to OSN Envoy. We always try to keep this list updated and correct.
If you notice that your name is not listed here, then feel free to contact us.

Ar Rakin
Bill Natt
David Brook
Peter Williamson

関連情報