我想就如何对大文件(数百万行或每行)进行分组提供建议/帮助。
例如,
(1) 我有大文件(数百万行,制表符分隔)。我想要这个文件的一个子集,只有10000到100000的行。
(2) 我有大文件(数百万列,制表符分隔)。我想要这个文件的一个子集,只有10000到100000的列。
我知道有头,尾,切,分,awk或sed等工具。我可以用它们做简单的子集化。但是,我不知道该怎么做。
你可以提出任何建议吗?提前谢谢。答案 0 :(得分:28)
过滤行很容易,例如使用AWK:
cat largefile | awk 'NR >= 10000 && NR <= 100000 { print }'
使用CUT过滤列更容易:
cat largefile | cut -d '\t' -f 10000-100000
正如Rahul Dravid所说,cat
不是必须的,而且正如Zsolt Botykai所说,你可以使用以下方法提高性能:
awk 'NR > 100000 { exit } NR >= 10000 && NR <= 100000' largefile
cut -d '\t' -f 10000-100000 largefile
答案 1 :(得分:17)
一些不同的解决方案:
对于行范围:
在sed
:
sed -n 10000,100000p somefile.txt
对于awk
中的列范围:
awk -v f=10000 -v t=100000 '{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "\n" : OFS) }' details.txt
答案 2 :(得分:4)
对于第一个问题,从一个大文件中选择一组行,从头到尾滚动非常简单。你想从10000行开始从largefile获取90000行。从第10000行开始,tail会抓取largefile的后端,然后除了前90000行之外的所有行都会删除。
tail -n +10000 largefile | head -n 90000 -
答案 3 :(得分:3)
因为sed解决方案被打败了,所以我会发布一个perl
dito。
打印选定的行。
$ seq 100 | perl -ne 'print if $. >= 10 && $. <= 20'
10
11
12
13
14
15
16
17
18
19
20
要打印选择列,请使用
perl -lane 'print $F[1] .. $F[3] '
-F
与-a
一起使用,以选择分割线的分隔符。
要进行测试,请使用seq
和paste
生成一些列
$ seq 50 | paste - - - - -
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
26 27 28 29 30
31 32 33 34 35
36 37 38 39 40
41 42 43 44 45
46 47 48 49 50
让我们打印除第一列和最后一列之外的所有内容
$ seq 50 | paste - - - - - | perl -lane 'print join " ", $F[1] .. $F[3]'
2 3 4
7 8 9
12 13 14
17 18 19
22 23 24
27 28 29
32 33 34
37 38 39
42 43 44
47 48 49
在上面的join
语句中,有一个标签,您可以通过执行ctrl-v标签来获取它。