24

我想就如何对大文件(数百万行或行)进行子集化获得您的建议/帮助。

例如,

(1) 我有大文件(数百万行,制表符分隔)。我想要这个文件的一个子集,只有从 10000 到 100000 的行。

(2) 我有大文件(数百万列,制表符分隔)。我想要这个文件的一个子集,只有从 10000 到 100000 的列。

我知道有一些工具,如 head、tail、cut、split 和 awk 或 sed。我可以用它们来做简单的子集。但是,我不知道如何完成这项工作。

你能给点建议吗?提前致谢。

4

4 回答 4

32

过滤行很容易,例如使用 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 
于 2011-06-27T10:39:10.973 回答
17

一些不同的解决方案:

对于行范围: In 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
于 2011-06-27T10:50:13.880 回答
4

对于第一个问题,从一个大文件中选择一组行,将尾部连接到头部非常简单。您想要从第 10000 行开始的大文件中的 90000 行。tail 从第 10000 行开始抓取大文件的后端,然后 head 砍掉除前 90000 行之外的所有行。

tail -n +10000 largefile | head -n 90000 -
于 2012-08-27T18:55:25.513 回答
3

sed 解决方案被打败了,所以我会发布一个perldito。打印选定的行。

$ 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, 一起使用来选择分割线的分隔符。

测试、使用seqpaste生成一些列

$ 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 选项卡来获得它。

于 2011-06-27T10:57:58.967 回答