LINUX.ORG.RU

Вопрос к знатокам shell-скриптинга...


0

0

Всем привет, нужна помощь, буду очень рад, если кто-нить подскажет как можно сделать следующее:

есть куча текстовых файлов, в каждом есть строчка вида:

Blablabla: 2.34

тоесть -> определённое слово(во всех файлах одиноковое), двоеточие, пробел, число.

мне нужно показать имена фалов, в которых это число меньше определённого, например меньше 5.

пробовал делать и через for i in... и через find ... | xargs... но что-то видимо не так делаю, не получается :(

Подскажите куда копать.

Заранее благодарен!

Вопрос, каким набором программы вы хотите ограничиться. Я бы использовал awk, но можно и с помощью grep и bash. А так общий алгорим:

1. Вытащить из файла число
2. Сравнить его с заданным.

Что из этого вызывает затруднение?

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

ограничений в принципе нет, можно и awk...

что вызывает затруднения... да я сам не пойму, вроде просто всё... видимо лисп за последнее время совсем мне моск съел, нормально думать перестал :)

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

>видимо лисп за последнее время совсем мне моск съел Вы так поосторожнее, а то на призрак Луговского нарваться не долго... Ну вот максимально тупо: #!/bin/bash for i in * ; do A=( `sed -n "s/Blablabla: \([0-9]*\)/\1/p" $i ` ) good= for B in ${A[*]} ; do B=${B%%.*} [ "$B" -lt 5 ] && good=y done [ "$good" == y ] && echo $i done А вот если нужно сравнивать не целые числа, то будет сложнее. Либо вызывать bc, либо городить преобразование с ${B#*.}

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

Так я и не научился правильно форматировать текст :(
Да еще офтопик в паре с мигающими пешеходными светофорами Новосибирска разъедают мозг...

>видимо лисп за последнее время совсем мне моск съел
Вы так поосторожнее, а то на призрак Луговского нарваться не долго...

Ну вот максимально тупо:
#!/bin/bash
for i in * ; do
  A=( `sed -n "s/Blablabla: \([0-9]*\)/\1/p" $i ` )
  good=
  for B in ${A[*]} ; do
     B=${B%%.*}
     [ "$B" -lt 5 ] && good=y
  done
  [ "$good" == y ] && echo $i
done

А вот если нужно сравнивать не целые числа, то будет сложнее.
Либо вызывать bc, либо городить преобразование с ${B#*.}

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

о! спасибо большое! вполне даже сработало! теперь осталось разобрать эти файлы :))

Cy6erBr4in ★★★
() автор топика
Ответ на: комментарий от sdio

> смысл в такой конструкции?

Каковы альтернативы? 'for f in *; do awk ... $f; done'? Тогда смысл -- в меньшем количестве вызовов и инициализаций интерпретатора awk. Да и вообще, универсальнее: вместо ls можно поставить все, что угодно, дающее на выходе список имен файлов.

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

а, понял, что имеется в виду :) Почему не awk ... *.txt? ls *.txt -- просто пример. Предполагается замена на любой другой генератор списка имен файлов, например, find.

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

Я имел ввиду, что наличие шаблона *.txt у команды ls, может вызвать переполнение буфера командной строки (или как оно там по-русски называется)

sdio ★★★★★
()

Всем большое спасибо! Вариант с awk тоже работает как надо, наверное его буду использовать :)

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