大きなファイル(数百万行または数百万行)のサブセットを作成する方法について、アドバイス/ヘルプをお願いします。
例えば、
(1)大きなファイルがあります(何百万もの行、タブ区切り)。 10000から100000までの行のみを含むこのファイルのサブセットが必要です。
(2)大きなファイル(数百万の列、タブ区切り)があります。 10000から100000までの列のみを含むこのファイルのサブセットを作成します。
ヘッド、テール、カット、スプリット、awk、sedなどのツールがあることは知っています。簡単なサブセット化に使用できます。しかし、私はこの仕事をする方法を知りません。
何かアドバイスはありますか?前もって感謝します。
行のフィルタリングは、たとえばAWKを使用すると簡単です。
cat largefile | awk 'NR >= 10000 && NR <= 100000 { print }'
CUTを使用すると、列のフィルタリングが簡単になります。
cat largefile | cut -d '\t' -f 10000-100000
Rahul Dravidが述べたように、ここではcat
は必須ではありません。ZsoltBotykaiが追加したように、以下を使用してパフォーマンスを改善できます。
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 -v f=10000 -v t=100000 '{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "\n" : OFS) }' details.txt
最初の問題については、大きなファイルから行のセットを選択し、末尾へのパイプの配管は非常に簡単です。行10000から始まるlargefileから90000行が必要です。tailは行10000から始まるlargefileのバックエンドを取得し、最初の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
と組み合わせて使用され、行を分割する区切り文字を選択します。
テストするには、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タブを実行すると、タブが表示されます。