从文件中获取等间距的n行

时间:2015-04-18 06:45:06

标签: bash sed

我有1000行的大文件。我想从中获得110行。 行应该在输入文件中均匀分布。

例如,我已经从文件中读取了4行<10行

输入文件

1
2
3
4
5
6
7
8
9
10

不过outFile:

1
4
7
10

4 个答案:

答案 0 :(得分:4)

使用:

sed -n '1~9p' < file

-n选项会阻止sed输出任何内容。 '1~9p'告诉sed每9行从第1行打印(最后订单p sed打印)。

要靠近110行,您必须每隔9行(1000 / 110~9)打印一次。


更新:此答案将打印112行,如果您只需要110行,则可以使用head限制输出,如下所示:

sed -n '1~9p' < file | head -n 110

答案 1 :(得分:3)

$ cat tst.awk
NR==FNR { next }
FNR==1 { mod = int((NR-1)/tgt) }
!( (FNR-1)%mod ) { print; cnt++ }
cnt == tgt { exit }

$ wc -l file1
1000 file1

$ awk -v tgt=110 -f tst.awk file1 file1 > file2

$ wc -l file2
110 file2

$ head -5 file2
1
10
19
28
37

$ tail -5 file2
946
955
964
973
982

请注意,在发布的输入文件中,这不会产生您在问题中发布的输出,因为这需要一个并不总是在输出行之间使用相同间隔的算法。您可以动态计算mod并在解析输入文件时进行调整,但上述情况可能已经足够了。

答案 2 :(得分:2)

使用awk,你可以做到:

 awk -v interval=3 '(NR-1)%interval==0' file

其中interval是打印的连续行之间的行数差异。该值基本上是文件中总行数的除以除了打印的行数。

答案 3 :(得分:2)

我经常喜欢将shell和awk的组合用于这些事情

#!/bin/bash

filename=$1
toprint=$2

awk -v tot=$(expr $(wc -l < $filename)) -v toprint=$toprint '
BEGIN{ interval=int((tot-1)/(toprint-1)) }

(NR-1)%interval==0 {
    print;
    nbr++
}

nbr==toprint{exit}

' $filename

一些例子:

$./spread.sh 1001lines 5
1
251
501
751
1001
$ ./spread.sh 1000lines 110 |head -n 3
1
10
19
$ ./spread.sh 1000lines 110 |tail -n 3
964
973
982