Bashで文字列で始まるすべての行をテキストファイルの先頭に移動する方法

Bashで文字列で始まるすべての行をテキストファイルの先頭に移動する方法

テキストデータを含むテキストファイルがあります。 XY:とOTP XY:で始まるすべての行をファイルの先頭に移動したいです。 sed、awk、または他のコマンドを使用してBashでこれをどのように実行しますか?

答え1

GNUを使用するed(注:これはfile内部修正、編集されたファイルをstdoutに出力するwqにはに変更されます,p q):

printf '%s\n' 'g/^\(\|OTP \)XY:/m0' wq | ed -s file

答え2

使用grep:

{ grep -E '^(OTP )?XY:' input_file; grep -E -v '^(OTP )?XY:' input_file; } > ouput_file

これらの2つのgrepコマンドは、input_file()なしで目的のパターンを使用して-vフィルタリングします。

{ ... } > output_file両方の出力を grepファイルに保存します。

答え3

もう一つのアプローチはを使用することですawk。たとえば、次のようになります。

awk -v re='^OTP XY:|^XY:'  'NR==FNR && $0 ~ re; NR!=FNR && $0 !~ re' file file

上記は単一のプロセスを使用し、メモリに1行以上保存せずにファイルに2回渡します(2回読みます)。

2つのパターンのいずれかがファイル内で発生する可能性がない場合、つまりRAMに入るのに十分小さい場合は、次のように使用できます。

awk  '/^OTP XY:|^XY:/{print;next} {a = $0 ORS a};END{printf "%s", a}' file

これも単一のプロセスを使用します。今回はファイルへの単一パスを作成しますが、ファイルのサイズ/内容によってはメモリ使用量が大幅に増加する可能性があります。

関連情報