как установить подмножество файла - выбрать количество строк или столбцов - PullRequest
21 голосов
/ 27 июня 2011

Я хотел бы получить ваш совет / помощь по поводу того, как разместить большое количество файлов (миллионы строк или строк).

Например,

(1) У меня большой файл (миллионы строк, разделенные табуляцией). Я хочу подмножество этого файла только с строками от 10000 до 100000.

(2) У меня большой файл (миллионы столбцов, разделенные табуляцией). Я хочу подмножество этого файла только с колонками от 10000 до 100000.

Я знаю, что есть такие инструменты, как голова, хвост, вырезать, расколоться, и awk, или sed. Я могу использовать их для простого поднабора. Но я не знаю, как сделать эту работу.

Не могли бы вы дать совет? Заранее спасибо.

Ответы [ 4 ]

28 голосов
/ 27 июня 2011

Фильтрация строк проста, например, с помощью AWK:

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

С помощью CUT проще фильтровать столбцы:

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

Как упоминал Рахул Дравид, cat здесь не является обязательным, и, как добавил Жолт Ботыкай, вы можете улучшить производительность, используя:

awk 'NR > 100000 { exit } NR >= 10000 && NR <= 100000' largefile
cut -d '\t' -f 10000-100000 largefile 
17 голосов
/ 27 июня 2011

Несколько различных решений:

Для диапазонов строк: 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
4 голосов
/ 27 августа 2012

Для первой проблемы, выбирая набор строк из большого файла, очень просто провести по конвейеру. Требуется 90000 строк из крупного файла, начиная со строки 10000. tail захватывает задний конец большого файла, начиная со строки 10000, а затем отрубает голову всем, кроме первых 90000 строк.

tail -n +10000 largefile | head -n 90000 -
3 голосов
/ 27 июня 2011

Был избит за решение для 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...