web-dev-qa-db-ja.com

ファイルをサブセット化する方法-行または列の数を選択する

大きなファイル(数百万行または数百万行)のサブセットを作成する方法について、アドバイス/ヘルプをお願いします。

例えば、

(1)大きなファイルがあります(何百万もの行、タブ区切り)。 10000から100000までの行のみを含むこのファイルのサブセットが必要です。

(2)大きなファイル(数百万の列、タブ区切り)があります。 10000から100000までの列のみを含むこのファイルのサブセットを作成します。

ヘッド、テール、カット、スプリット、awk、sedなどのツールがあることは知っています。簡単なサブセット化に使用できます。しかし、私はこの仕事をする方法を知りません。

何かアドバイスはありますか?前もって感謝します。

21
jianfeng.mao

行のフィルタリングは、たとえば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 
29
Drakosha

いくつかの異なるソリューション:

行範囲の場合: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
17
Vijay

最初の問題については、大きなファイルから行のセットを選択し、末尾へのパイプの配管は非常に簡単です。行10000から始まるlargefileから90000行が必要です。tailは行10000から始まるlargefileのバックエンドを取得し、最初の90000行以外のすべてをヘッドチョップします。

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

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タブを実行すると、タブが表示されます。

3
Fredrik Pihl