テキストデータを含むテキストファイルがあります。 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
これも単一のプロセスを使用します。今回はファイルへの単一パスを作成しますが、ファイルのサイズ/内容によってはメモリ使用量が大幅に増加する可能性があります。