我有1000行的大文件。我想从中获得110行。 行应该在输入文件中均匀分布。
例如,我已经从文件中读取了4行<10行
输入文件
1 2 3 4 5 6 7 8 9 10
不过outFile:
1 4 7 10
答案 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