2011-06-27 45 views
15

我想就如何子集大文件(數百萬行或行)提供建議/幫助。如何子集文件 - 選擇行數或列數

例如,

(1) 我有大文件(數百萬行,製表符分隔)。我想這個文件的一個子集只有從10000到100000行。我有大文件(百萬列,製表符分隔)。我想這個文件的一個子集只有從10000到100000列。

我知道有工具,如頭部,尾部,剪切,分裂和awk或sed。我可以使用它們來做簡單的子集。但是,我不知道該怎麼做這份工作。

請問您有什麼建議嗎?提前致謝。

回答

22

過濾行是容易的,例如用AWK:

cat largefile | awk 'NR >= 10000 && NR <= 100000 { print }' 

過濾柱是切容易:

cat largefile | cut -d '\t' -f 10000-100000 

由於拉胡爾·德拉維德提到,cat是不是必須在這裏,和索爾特Botykai補充說,你可以改善使用性能:

awk 'NR > 100000 { exit } NR >= 10000 && NR <= 100000' largefile 
cut -d '\t' -f 10000-100000 largefile 
+5

+1這是我能夠想到of.But貓不需要這裏。我們能做到這一點沒有cat.'awk「NR> = 10000 && NR <= 100000 {}打印」最簡單的答案 largefile'和'cut -d'\ t'-f 10000-100000 largefile' – Vijay

+0

@Rahul Dravid:謝謝,我會添加它 – Drakosha

+6

您可以縮短第一個:awk'NR> = 10000 && NR <= 100000'largefile',這少了一個過程,如果範圍評估爲true,awk的默認操作就是打印。 但是這樣會在沒有任何東西的情況下讓行100000,所以最好寫下來:'awk'NR> 100000 {exit} NR> = 10000 && NR <= 100000'largefile'這樣處理將在第100001st行停止。 –

15

有些不同NT解決方案:

對於行範圍: 在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 
+0

非常感謝Rahul。你給我一個關於sed和awk的好方向。雖然我可以在簡單的操作中使用它們,但我從你身上學到了很多。 –

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,來選擇要在其上分割線的分隔符。

爲了進行測試,使用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標籤來獲得它。

4

對於第一個問題,從大文件中選擇一組行,管尾對齊非常簡單。您需要從10000行開始的largefile生成90000行。tail從第10000行開始抓取largefile的後端,然後刪除第90000行以外的所有行。

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