我想就如何子集大文件(數百萬行或行)提供建議/幫助。如何子集文件 - 選擇行數或列數
例如,
(1) 我有大文件(數百萬行,製表符分隔)。我想這個文件的一個子集只有從10000到100000行。我有大文件(百萬列,製表符分隔)。我想這個文件的一個子集只有從10000到100000列。
我知道有工具,如頭部,尾部,剪切,分裂和awk或sed。我可以使用它們來做簡單的子集。但是,我不知道該怎麼做這份工作。
請問您有什麼建議嗎?提前致謝。
我想就如何子集大文件(數百萬行或行)提供建議/幫助。如何子集文件 - 選擇行數或列數
例如,
(1) 我有大文件(數百萬行,製表符分隔)。我想這個文件的一個子集只有從10000到100000行。我有大文件(百萬列,製表符分隔)。我想這個文件的一個子集只有從10000到100000列。
我知道有工具,如頭部,尾部,剪切,分裂和awk或sed。我可以使用它們來做簡單的子集。但是,我不知道該怎麼做這份工作。
請問您有什麼建議嗎?提前致謝。
過濾行是容易的,例如用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
有些不同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
非常感謝Rahul。你給我一個關於sed和awk的好方向。雖然我可以在簡單的操作中使用它們,但我從你身上學到了很多。 –
被打它的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標籤來獲得它。
對於第一個問題,從大文件中選擇一組行,管尾對齊非常簡單。您需要從10000行開始的largefile生成90000行。tail從第10000行開始抓取largefile的後端,然後刪除第90000行以外的所有行。
tail -n +10000 largefile | head -n 90000 -
+1這是我能夠想到of.But貓不需要這裏。我們能做到這一點沒有cat.'awk「NR> = 10000 && NR <= 100000 {}打印」最簡單的答案 largefile'和'cut -d'\ t'-f 10000-100000 largefile' – Vijay
@Rahul Dravid:謝謝,我會添加它 – Drakosha
您可以縮短第一個:awk'NR> = 10000 && NR <= 100000'largefile',這少了一個過程,如果範圍評估爲true,awk的默認操作就是打印。 但是這樣會在沒有任何東西的情況下讓行100000,所以最好寫下來:'awk'NR> 100000 {exit} NR> = 10000 && NR <= 100000'largefile'這樣處理將在第100001st行停止。 –