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 から始まる largefile から 90000 行が必要です。tail は行 10000 から始まる largefile のバックエンドを取得し、head は最初の 90000 行を除くすべてを切り捨てます。

tail -n +10000 largefile | head -n 90000 -
于 2012-08-27T18:55:25.513 に答える
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 タブを実行することで取得できます。

于 2011-06-27T10:57:58.967 に答える