Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > *NIX системы: Общие вопросы > Прошу помощи


Автор: Testernew 15.1.2014, 18:14
Есть файл some.txt с блоками текста которые разделены пробелами

Пример:

Цитата

111111test
1111value
1111111111
1111111111

222222test
2222222222
22222value
2222222222

222222test
2222222222
2222222222
2222222222


Задача: Если в блоке(блок: от пустой строки до пустой строки) текста есть подстрока 'value' то найти и считать значение test которое находиться в первой строке и записать его в файл res.txt и.т.д для всех блоков в файле.

Автор: Romikgy 15.1.2014, 23:34
на любом скриптовом(аля перл или питон) языке написать парсер для сего...

Автор: beroal 16.1.2014, 10:03
Да и на Си будет не трудно написать.

Автор: tzirechnoy 16.1.2014, 14:49
Код
awk -v FS='\n' -v RS='\n\n' ' /value/ { print $1 }' <infile.txt >outfile.txt

Автор: Testernew 19.1.2014, 13:41
Цитата(tzirechnoy @ 16.1.2014,  14:49)
Код
awk -v FS='\n' -v RS='\n\n' ' /value/ { print $1 }' <infile.txt >outfile.txt

Большое спасибо!!!
Подскажите как тут лучше сделать.


Задача, взять строку из файла result.txt найти ее в файле base.txt и записать данные которые расположены после ";" (после ; могут быть как буквы так и цифры разного регистра) из этой строки в файл finish.txt
Вот как я пробую это сделать. но что то не разобрался с циклам for в bash.
Файл result.txt содержит ip адреса.


Пример Файла:
Код

1.1.1.1
22.22.22.22
196.196.196.196


Файл base.txt содержит записи вида:

Пример файла:
Код

11.11.11.11;TeSt_Some2_inFo
99.12.122.129;Some2_inFo55


Код

#!/bin/bash

result=`cat result.txt`
base='cat base.txt'
for i in $result; do
 for j in $base; do
   if  [ echo $j | grep -v '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' == $i ];
       echo $j | grep -v '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' >> finish.txt
 done
done

Автор: tzirechnoy 19.1.2014, 19:01
Чтобы в bash проще разбираться -- у него есть set -x

Но вообще -- в base=... кавычки неправильные (нужны апострофы).

Что Вы хотели сделать grepом -- я так и не понял, но в любом случае ничего полезного он у вас делать не будет. Прочитайте man, и попробуйте этот вид grep отдельно, чтобы понять, что он делает.

Да, а как лучшэ -- зависит от многих мелочей. Например, от соотношэния размеров файлов base и result, от того, простая ли структура в base -- или там можэт быть правильный csv, от того, достаточно ли сравнивать строки или надо именно как ip-адреса (у которых можэт быть разное текстовое представление по разным причинам).

Автор: Testernew 26.1.2014, 14:15
Цитата

Что Вы хотели сделать grepом -- я так и не понял, но в любом случае ничего полезного он у вас делать не будет.


Хотел сравнить содержимое строки исключив из нее ip адрес.

Вот Как я решил эту задачу(может кому то поможет) возможно не самый оптимальный и быстрый вариант, но работает.

Код

cat result.txt | while read line; do
   cat base.txt | while read line2; do
     if [ $line = `echo $line2 | cut -d ";" -f1` ]; then
       echo $line2 | cut -d ";" -f2 > finish.txt
       break
      fi
   done
done

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)