web-dev-qa-db-ja.com

テキストファイルから奇数行または偶数行を削除する

ダウンサンプリングを行うには、テキストファイルの奇数行を削除する必要があります。私はこのコマンドを見つけました、

awk 'NR%2==0' file

ただし、端末の奇数行のみを印刷します。それらを本当に削除する方法は?

偶数でも奇数でもかまいません。ファイルから削除するか、別のファイルに印刷してください。これは、ターミナルでのみ印刷します。

36
SamuelNLP

awk

%はモジュラス演算子であり、NRは現在の行番号です。したがって、NR%2==0は偶数行に対してのみtrueであり、それらのデフォルトルールを呼び出します({ print $0 }) 。したがって、偶数行のみを保存するにはawkからの出力を新しいファイルにリダイレクトします。

awk 'NR%2==0' infile > outfile

sed

sedでも同じことができます。 devnulls answerは、GNU sedを使用してそれを行う方法を示します。以下は、~演算子を持たないsedのバージョンの代替案です。

奇数行を保つ

sed 'n; d' infile > outfile

偶数行を維持する

sed '1d; n; d' infile > outfile
72
Thor

GNU sed:

sed -i '0~2d' filename

ファイルから偶数行を削除します。

奇数行を削除するには:

sed -i '1~2d' filename

-iオプションを使用すると、変更がファイルにインプレースで保存されます。

マニュアルから引用:

`FIRST~STEP'
     This GNU extension matches every STEPth line starting with line
     FIRST.  In particular, lines will be selected when there exists a
     non-negative N such that the current line-number equals FIRST + (N
     * STEP).  Thus, to select the odd-numbered lines, one would use
     `1~2'; to pick every third line starting with the second, `2~3'
     would be used; to pick every fifth line starting with the tenth,
     use `10~5'; and `50~0' is just an obscure way of saying `50'.
13
devnull

ネガティブ(ラインを削除する)に焦点を合わせないで、ポジティブ(ラインを選択する)に焦点を合わせると、ソリューションはそれに続きます。したがって、I need to remove odd linesの代わりにI need to select even linesを考える必要があります。その場合の解決策は次のとおりです。

awk '!(NR%2)' file

結果を新しいファイルに保存する場合:

awk '!(NR%2)' file > newfile

または元に戻す:

awk '!(NR%2)' file > newfile && mv newfile file
5
Ed Morton

これはあなたのために働くかもしれません(GNU sed):

 sed -n 'p;n' file # keep odd
 sed -n 'n;p' file # keep even
3
potong

次に、奇数行と偶数行をそれぞれ含む2つの新しいファイルを作成するawkの例を示します。

awk '{ if (NR%2) print > "odd.txt"; else print > "even.txt" }' input.txt
3
twalberg

偶数を新しいファイルに印刷するためのPerlソリューション:

Perl -lne 'print if $. % 2 == 0' infile > outfile

オッズを出力するには、== 1== 0に変更します

$.は行番号です

元のファイルに偶数のみを保持します。

Perl -i -lne 'print if $. % 2 == 0' infile

上記と同じですが、infile.bakというバックアップファイルを作成します。

Perl -i.bak -lne 'print if $. % 2 == 0' infile
1
Chris Koknat