Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.186.173] |
|
Сообщ.
#1
,
|
|
|
Можно ли при помощи sed решить следующую задачу
есть файл, в котором два столбца вида char1 value1 char1 value2 char1 value3 char2 value4 char3 value5 и т.д нужно посчитать для каждого char сумму всех value и вывести в файл |
Сообщ.
#2
,
|
|
|
кажется, что sed тут не помощник, но вот awk может помочь
$ cat file.txt a 1 b 2 a 4 c 5 b 5 $ cat file.txt | awk '{S[$1]+=$2}END{for(c in S){print c, S[c]}}' a 5 b 7 c 5 |
Сообщ.
#3
,
|
|
|
Цитата XandoX @ awk '{S[$1]+=$2}END{for(c in S){print c, S[c]}}' Спасибо, работает, сортировка только нарушилась, но это поправимо! |
Сообщ.
#4
,
|
|
|
Цитата XandoX @ кажется, что sed тут не помощник, но вот awk может помочь $ cat file.txt a 1 b 2 a 4 c 5 b 5 $ cat file.txt | awk '{S[$1]+=$2}END{for(c in S){print c, S[c]}}' a 5 b 7 c 5 Что-то не могу совладать с awk... А как вывести еще и кол-во повторений элементов первого столбца ? То есть сколько раз повторяется $1 ? |
Сообщ.
#5
,
|
|
|
Цитата andyics @ А как вывести кол-во повторений элементов первого столбца ? То есть сколько раз повторяется $1 ? $ cat file.txt | awk '{C[$1] += 1}END{for (i in C) { print i, C[i]}}' a 2 b 2 c 1 |
Сообщ.
#6
,
|
|
|
Цитата XandoX @ Большое спасибо, все работает!!! |
Сообщ.
#7
,
|
|
|
Есть файл в шестой строке цифры от 0 до 9
Нужно просто вывести цифру 9 на экран, если она там есть конструкция head -n6|tail -n1| sed 's/\(.*\)\(9\)\(.*)\/\2/' выводит на экран 9, если она есть в строке, если же ее нет, то печатается вся строка целиком. Что нужно поменять, чтобы в случае отсутствия цифры 9 выводилось, например 0 ? |
Сообщ.
#8
,
|
|
|
Что за странная любовь к sed?
используй grep ➜ /tmp cat test.txt sdfsdf jskdf 9 skjhsdfjk sdf ➜ /tmp cat test.txt | head -n 1 | tail -n 1 | grep -q 9 && echo 'yes' || echo 'no' yes ➜ /tmp cat test.txt | head -n 2 | tail -n 1 | grep -q 9 && echo 'yes' || echo 'no' no |
Сообщ.
#9
,
|
|
|
Цитата XandoX @ Ну с grepom все ясно, а sed все-таки? Тем более, что потом нужно искать определенное положение символа в строке и sed тут в самый раз... |
Сообщ.
#10
,
|
|
|
Никаких "потом". Все надо делать в один проход. Если алгоритм этого не может, тогда:
1) обработать оригинальные файлы на предмет 9. 2) преобразовать оригинальные файлы, ликвидировав 9 (что это будет, либо s/\(.*\)\(9\)\(.*)\/\1\3/, либо s/\(.*\)\(9\)\(.*)\/\10\3/, решите сами). 3) делать "потом" на модифицированных данных. |
Сообщ.
#11
,
|
|
|
Кстати, конструкция, объявленная как работающая, будет работать только с одной девяткой. Если их много, то устранить их вышеприведенными примерами паттернов RE не удастся.
Так что все завязано на домене допустимых значений для строки 6. Тут Вам виднее что там может быть. |
Сообщ.
#12
,
|
|
|
Ребята, "откройте" для себя Perl Любые манипуляции с любым текстом сведены к минимуму. Perl - де факто есть в любой *nix системе. Сформулируйте конечное задание - сделаю скрипт.
|
Сообщ.
#13
,
|
|
|
Есть файл в котором три столбца. Проиндексирован по первым двум.
конструкция вида awk '{n[$3]+=1}END{for c in n){print c,n[c]}} позволяет посчитать кол-во значений в третьем столбце. А как при этом вывести, например еще первое и последнее значение по второму полю ?? |
Сообщ.
#14
,
|
|
|
Отвечаю сам себе.
Оказывается, массив n[$3 "" $2] решает на 90% задачу... |
Сообщ.
#15
,
|
|
|
Цитата andyics @ Оказывается, массив n[$3 "" $2] решает на 90% задачу... Вот код на Перле, который решает на 100% задачу (если я ее правильно понял): #!/usr/bin/perl # пусть @A - матрица с содержимым: # 1 ss ff # 22 xxx ff # 333 sss aaaa push @A , " 1 ss ff"; push @A , " 22 xxx ff"; push @A , "333 sss aaaa"; # Но, если хотим обработать текстовой файл с помощью perl script.pl < текст.txt, # раскоментируем следующую строку # @A = <STDIN>; map { @X = split(" ",$_); $C1{$X[2]} = "."; $C2{$X[1]} = "."; } @A; @C2 = sort(keys(%C2)); print "Количество уникальных значений по третьему столбцу: ".scalar(keys(%C1))."\n"; print "Минимальное значение по второму столбцу: ".((scalar(@C2)>0) ? $C2[0] : "нет")."\n"; print "Максимальное значение по второму столбцу: ".((scalar(@C2)>0) ? $C2[scalar(@C2)-1] : "нет")."\n"; Тут онлайн-выполнение. |
Сообщ.
#16
,
|
|
|
Как при помощи sed найти, например, третий пробел в строке и удалить перед ним все символы до первой точки и ее включительно ?
|
Сообщ.
#17
,
|
|
|
echo "mama mila ramu i. esho chtomo" | sed 's/.*\s.*\s.*\s.*\.\(.*\)/\1/' |
Сообщ.
#18
,
|
|
|
Цитата XandoX @ Не то! mama mila.ramu dveri okna i pol должно остаться mama mila okna i pol |