web-dev-qa-db-ja.com

sedで他のすべての行を削除するにはどうすればよいですか?

Sedを使用して、奇数行をすべて削除するにはどうすればよいですか?

remove
keep
remove
keep
remove
...
39
hhh

GNU sedには適切なアドレス指定モードがあります。

sed -n '1~2!p' file

つまり、1行目から開始し、手順2で他のすべての行を印刷します。

同様に、-n、および一致する行を削除します。

sed '1~2d'

Awkを使用して行うこともできます。

awk 'NR%2==0' file

(行番号が2の倍数になるたびに、行を印刷します)

67
ghostdog74

私が考えることができる最短はここにあります:

sed -n 'g;n;p' file

これは、GNU以外のバージョンのsed(およびGNU sed)と連携する必要があります。

36

これは、GNUおよびsedのBSD(mac)バージョンで動作します。

奇数行を削除するには(偶数行を印刷):

sed -n ’n;p’ file

少し混乱するように見えるかもしれませんので、フードの下でステップバイステップで何が起こるかを以下に示します。

  1. sed:最初の行を読み取ります
  2. -n:最初の行の出力を抑制します
  3. n:出力は抑制されるため、何も書き出さないでください
  4. n(再び):次の(2番目の)行をパターンバッファーに読み込みます。つまり、すぐに処理します。
  5. p:抑制された出力、つまり2行目を上書きするパターンバッファーで利用可能なものをすべて出力します
  6. sed:3行目で読み取ります。手順4の「n」のおかげで2行目がすでに処理されているためです。
  7. -n:3行目の出力を抑制します
  8. ...
  9. ...

偶数行を削除するには(奇数行を印刷):

sed -n ‘p;n’ file

フードの下でアルゴリズム的に行われることは次のとおりです。

  1. sed:最初の行を読み取ります
  2. -n:最初の行の出力を抑制します
  3. p:パターンバッファーの内容、つまり最初の行を出力し、抑制された出力を上書きします
  4. n:出力は抑制されるため、何も書き出さないでください
  5. n(再び):次の(2番目の)行でパターンバッファーに読み込んで即時処理しますが、コマンドがこれ以上ないため、何も起こりません
  6. sed:3行目で読み取ります。2行目は手順5の「n」のおかげですでに「処理済み」になっているためです。
  7. -n:3行目の出力を抑制します
  8. p:抑制された出力を上書きして3行目を出力します
  9. ...
5
balanyo

Perlソリューション:

Perl -ne 'print if $. % 2 == 0' file

$.は行番号です

4
Chris Koknat

もう1つのawk:

awk getline file
2
Scrutinizer