Как подмножество файла - выберите количество строк или столбцов

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

Например,

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

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

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

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

Ответы

Ответ 1

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

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

Фильтрация столбцов проще с помощью CUT:

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

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

awk 'NR > 100000 { exit } NR >= 10000 && NR <= 100000' largefile
cut -d '\t' -f 10000-100000 largefile 

Ответ 2

Некоторые различные решения:

Для диапазонов строк: В 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

Ответ 3

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

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

Ответ 4

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