简体   繁体   中英

Remove odd or even lines from a text file

I need to remove odd lines in a text file to make a down-sampling. I've found this command,

awk 'NR%2==0' file

but it only prints the odd lines in the terminal. How to really remove them?

I don't really care for even or odd, I want them removed from the file or printed in another file. This only prints them in the terminal.

awk

The % is a modulus operator and NR is the current line number, so NR%2==0 is true only for even lines and will invoke the default rule for them ( { print $0 } ). Thus to save only the even lines , redirect the output from awk to a new file:

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

sed

You can accomplish the same thing with sed . devnulls answer shows how to do it with GNU sed . Below are alternatives for versions of sed that do not have the ~ operator:

keep odd lines

sed 'n; d' infile > outfile

keep even lines

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

Using GNU sed:

sed -i '0~2d' filename

to remove the even numbered lines from the file.

For removing odd numbered lines:

sed -i '1~2d' filename

The -i option would cause the changes to be saved to the file in-place.

Quoting from the manual:

`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'.

This might work for you (both GNU and non-GNU sed):

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

-n : suppress printing

p : print current line

n : next line

Don't focus on the negative (removing lines), focus on the positive (selecting lines) and your solution will follow suit. So instead of I need to remove odd lines you should be thinking I need to select even lines and then the solution is simply:

awk '!(NR%2)' file

If you want to save the result to a new file:

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

or back to the original:

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

这是一个awk示例,用于创建分别包含奇数行和偶数行的两个新文件:

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

Perl solution for printing evens to new file:

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

To print odds, change == 1 to == 0

$. is the line number

Keeps only evens in the original file:

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

Same as above, but makes a backup file called infile.bak:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM