Как подмножество файла - выберите количество строк или столбцов
Я хотел бы получить ваш совет/помощь по подмножеству большого файла (миллионы строк или строк).
Например,
(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.