考虑一个带有科学数据的文本文件,例如:
5.787037037037037063e-02 2.048402977658663748e-01
1.157407407407407413e-01 4.021264347118673754e-01
1.736111111111111049e-01 5.782032163406526371e-01
如何轻松删除,例如,每隔一行,或文件中每10行中的9行?例如是否可以使用bash脚本?
背景:文件非常大,但我需要的数据要少得多。请注意,我使用的是Ubuntu / Linux。
答案 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更改为另一个整数即可。