GNU/Linux >> Linux の 問題 >  >> Linux

複数行が連続するテキストファイルを並べ替える

msort(1) 複数行のレコードを含むファイルをソートできるように設計されました。オプションの gui と、人間が使用できる通常のコマンド ライン バージョンがあります。 (少なくとも、マニュアルを注意深く読み、例を探すのが好きな人間...)

AFAICT、レコードに任意のパターンを使用することはできないため、レコードが固定サイズ(文字や行ではなくバイト単位)でない限り。 msort -b があります 空白行で区切られた行のブロックであるレコードのオプション。

入力を -b で動作する形式に変換できます すべての ###... の前に空行を置くことで、非常に簡単に (最初のものを除く)。

デフォルトでは、stderr に統計を出力するため、少なくとも、入力全体が 1 つのレコードであると見なされてソートされなかった場合は簡単にわかります。

msort あなたのデータに働きかけます。 sed コマンドは #+ ごとに改行を追加します 行 1 を除く行。 -w レコード全体を (辞書順で) ソートします。レコードのどの部分をキーとして使用するかを選択するオプションがありますが、私には必要ありませんでした.

また、余分な改行の削除も省略しました。

$ sed '2,$ s/^#\+/\n&/' unsorted.records | msort -b -w 2>/dev/null 
####################################
KEY1
VAL11
VAL12
VAL13
VAL14

####################################
KEY2
VAL21
VAL22
VAL23
VAL24

####################################
KEY3
VAL31
VAL32
VAL33
VAL34

-r '#' で運が悪かった それをレコードセパレーターとして使用します。ファイル全体を 1 つのレコードと見なしていました。


解決策は、最初にブロック内の改行を選択した未使用の文字 (以下の例では「|」) に変更し、結果を並べ替えて、選択した区切り記号を元の改行に戻すことです:

sed -e 'N; N; N; N; N; s/\n/|/g' file.txt \
| sort -k2,2 -t\| \
| sed 's/|/\n/g'

perl -0ne 'print sort /(#+[^#]*)/g' file.txt
  • perl -0 ファイル全体をすする
  • /(....)/g レコードを照合して抽出する
  • print sort ... 並べ替えて印刷

Linux
  1. findおよびduコマンドを使用してLinuxで大きなファイルを検索する方法

  2. Sedを使用してテキストファイルから複数のランダム行を削除する方法は?

  3. レンジャーで特定のフォルダ内のファイルを並べ替えますか?

  1. 重複、わずかな変更、テキストファイルの数行?

  2. 複数のファイルテキストをSedに置き換えますか?

  3. Unix ソートで複数のキーをソートする

  1. テキストファイルの並べ替えに役立つAwkワンライナーとスクリプト

  2. bashでファイルをファイルタイプ別にフォルダにソートする方法(「file」コマンドを使用)?

  3. Ansible を使用してリモート マシンからローカルに複数のファイルをフェッチする方法