如何删除文本文件中的每个第N行?

时间:2012-03-27 17:59:36

标签: bash text

考虑一个带有科学数据的文本文件,例如:

5.787037037037037063e-02 2.048402977658663748e-01
1.157407407407407413e-01 4.021264347118673754e-01
1.736111111111111049e-01 5.782032163406526371e-01

如何轻松删除,例如,每隔一行,或文件中每10行中的9行?例如是否可以使用bash脚本?

背景:文件非常大,但我需要的数据要少得多。请注意,我使用的是Ubuntu / Linux。

6 个答案:

答案 0 :(得分:57)

使用awk很容易实现。

删除所有其他行:

awk 'NR % 2 == 0' file > newfile

删除每10行:

awk 'NR % 10 != 0' file > newfile

awk中的NR变量是行号。在awk中{}以外的任何内容都是有条件的,默认操作是打印。

答案 1 :(得分:6)

perl怎么样?

perl -n -e '$.%10==0&&print'       # print every 10th line

答案 2 :(得分:2)

尝试类似:

awk 'NR%3==0{print $0}' file

这将打印三行中的一行。或者:

awk 'NR%10<9{print $0}' file 

将打印10行中的9行。

答案 3 :(得分:2)

你可以用sed来做,例如

sed -n -e 'p;N;d;' file # print every other line, starting with line 1

如果你有GNU sed,这很容易

sed -n -e '0~10p' file # print every 10th line
sed -n -e '1~2p' file # print every other line starting with line 1
sed -n -e '0~2p' file # print every other line starting with line 2

答案 4 :(得分:2)

这可能适合你(GNU sed):

seq 10 | sed '0~2d' # delete every 2nd line
1
3
5
7
9
seq 100 | sed '0~10!d' # delete 9 out of 10 lines
10
20
30
40
50
60
70
80
90
100

答案 5 :(得分:0)

您可以使用awk和shell脚本。 awk可能很难但是......

这将删除您告诉它的特定行:

nawk -f awkfile.awk [filename]

awkfile.awk contents

BEGIN {
if (!lines) lines="3 4 7 8"
n=split(lines, lA, FS)
for(i=1;i<=n;i++)
 linesA[lA[i]]
}
!(FNR in linesA)

另外我不记得VIM是否带有标准的Ubuntu。如果没有得到它。

然后用vim打开文件     vim [filename]

然后输入

:%!awk NR\%2 or :%!awk NR\%2 

这将删除所有其他行。只需将2更改为另一个整数即可。