如何对文件进行分类 – select一些行或列

我想就如何对一个大文件进行子集(数百万行或几行)提供build议/帮助。

例如,

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

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

我知道有像头,尾巴,,分裂,awksed的工具。 我可以使用它们来做简单的子集。 但是,我不知道该怎么做。

你能给我一些build议吗? 提前致谢。

过滤行很容易,例如使用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 

一些不同的方案:

对于行范围:在sed

 sed -n 10000,100000p somefile.txt 

对于awk列范围:

 awk -vf=10000 -vt=100000 '{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "\n" : OFS) }' details.txt 

对于第一个问题,从一个大文件中选择一组行,管尾对齐很简单。 您需要从10000行开始的largefile生成90000行。tail从10000行开始抓取大文件的后端,然后删除除90000行之外的所有行。

 tail -n +10000 largefile | head -n 90000 - 

被殴打到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一起使用来选择分隔线的分隔符。

为了测试,使用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选项卡。