LINUX.ORG.RU

[sed -rn][эквилибристика] Нужно посчитать


0

1

Допустим, очень большой файл состоит из строк типа

.*sha-la-la[0-9].*tra-la-la[0-9].*
Задача — посчитать все tra-la-la1…tra-la-la9, у которых одинаковое sha-la-la. Так как счётчика в sed не предусмотрено (за исключением =, но я не придумал, как бы его здесь можно использовать, не сбрасывая временных данных в файл), то решено было привести файл к следующему виду, выделив по строке на каждую sha-la-la
sha-la-la tra-la-la1 tra-la-la2 tra-la-la3 …
А потом, когда объём таким образом уже полегчает, как-нибудь заменить все эти tra-la-la на собственно их число. Пока что я надумал только использовать для этого regexp вида
/.*(sha-la-la[0-9]).*(tra-la-la[0-9]).*/ {;;}
но перед этим как бы внутри {…} знать текущие \1 и \2?

Deleted

или awk хотя бы, там вроде были счетчики

marvin_yorke ★★★
()

До меня всё равно слабо дошло содержание ОП, ты бы пример файла не постеснялся привести, и то что ты хочешь получить на выходе.

>>Задача — посчитать все

grep --count не подойдёт?

adriano32 ★★★
()

Не анонируй. Просто используй python/ruby/perl.

anonymous
()

использовать авк/перл/питон вместо веда.

val-amart ★★★★★
()
Ответ на: комментарий от marvin_yorke

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

Deleted
()
Ответ на: комментарий от Deleted

на том уровне, что вам требуется, его реально освоить за 2 часа, что, я полагаю, меньше, чем вы уже потратили на изыскания с седом. Р. Шварц «Изучаем Perl» - то, что вам нужно. с ходу - попробуйте так [code=perl] #!/usr/bin/perl

$filename = $ARGS[0]; open my $FILE, «<$filename»; while (<$FILE>) { /sha-la-la(\d+).tra-la-la(\d+)/; # теперь в переменной $1 лежит номер sha-la-la # а в $2 - номер tra-la-la } close $FILE; [/code]

marvin_yorke ★★★
()
Ответ на: комментарий от marvin_yorke
 
#!/usr/bin/perl

$filename = $ARGS[0]; 
open my $FILE, "<$filename"; 

while (<$FILE>) 
{
   /sha-la-la(\d+).tra-la-la(\d+)/; 
   # теперь в переменной $1 лежит номер sha-la-la 
   # а в $2 - номер tra-la-la 
} 
close $FILE; 
marvin_yorke ★★★
()
Ответ на: комментарий от marvin_yorke

регулярку неправильно написал. ну думаю ее вы осилите. смысл - в группировке скобками. то, что попадает в первую скобку, кладется в $1, во вторую - в $2 и т.д.

marvin_yorke ★★★
()
Ответ на: комментарий от adriano32

Нет, я кончено могу собрать половину бусибокса и затолкать всё это в один конвейер, и это действительно будет работать, однако исходный файл грепать — это 1,5 гигабайта. Ну порежется там дай бог 2/3 — это значит, что ещё 500 MiB надо передавать через конвейер. Я потому и хочу начать седом и им же срезать как можно больше, (а заодно и отсортировать), потому что он работает с файлом построчно не запруживая память и в дальнейшем передаст приемлемый объём данных другой команде.

Deleted
()
Ответ на: комментарий от marvin_yorke

Спасибо, пойду разбираться.

Deleted
()

Такое чувство что описание задачи сложнее ее самой :) Ты бы еще больше дефисов между одинаковыми буквами подобавил, чтоб вообще читать невозможно было.

fagot ★★★★★
()

uniq+sort+wc -l
Или я не понял сабж?

Tanger ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.