URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9261
[ Назад ]

Исходное сообщение
"разбор строки"

Отправлено qwertEHOK , 20-Окт-11 19:24 
помогите, пожалуйста, со скриптом
(система Sco unix)

есть довольно большой файлик с таким содержимым
|Иванов Иван Иванович|город Москва|дом 3| |принято|


нужно взять текст между || и присвоить переменной
количество полей около 20
есть пустые строки

ЗЫ
раньше делал как то так
for fname in `cat list_dbf`
do
area=`echo $fname | cut -c 1-3
...
но тут столкнулся с пробелами. да и размер разный


Содержание

Сообщения в этом обсуждении
"разбор строки"
Отправлено Zl0 , 20-Окт-11 19:33 
>[оверквотинг удален]
> нужно взять текст между || и присвоить переменной
> количество полей около 20
> есть пустые строки
> ЗЫ
> раньше делал как то так
> for fname in `cat list_dbf`
> do
>  area=`echo $fname | cut -c 1-3
> ...
> но тут столкнулся с пробелами. да и размер разный

   area=`echo $fname | cut -d "|" -f 1

-f n  номер столбца

man cut

еще можно перед открытием делать grep -v ^$  чтобы избавится от пустых строк


"разбор строки"
Отправлено qwertEHOK , 20-Окт-11 19:41 

>    area=`echo $fname | cut -d "|" -f 1
> -f n  номер столбца
> man cut
> еще можно перед открытием делать grep -v ^$  чтобы избавится от
> пустых строк

делаю так
if [ -s itog.unl ]; then
    for fname in `cat itog.unl`
        do
            pole1=`echo $fname|cut -f 1 -d\|`
            echo $pole1
            pole2=`echo $fname|cut -f 2 -d\|`
            echo $pole2
exit
done
fi

Получается 2 раза фамилия



"разбор строки"
Отправлено qwertEHOK , 20-Окт-11 19:44 
а получается потому что пробел

я делал cut по 20 значным числам и все получалось, но тут ((((


"разбор строки"
Отправлено Ager , 20-Окт-11 22:09 
если количество полей в строке фиксированное и разделитель - всегда  '|'   то  awk  Вам в руки :)  

З.Ы. что-то мне это напоминает выгруженную из Informix`а таблицу ...


"разбор строки"
Отправлено ACCA , 21-Окт-11 01:27 
#!/bin/bash
IFS='|'
while read fname
do
   while read -a FLD
   do
      echo ${FLD[1]}, ${FLD[2]}
   done < $fname
done < list_dbf

"разбор строки"
Отправлено qwertEHOK , 21-Окт-11 11:03 
> #!/bin/bash
> IFS='|'
> while read fname
> do
>    while read -a FLD
>    do
>       echo ${FLD[1]}, ${FLD[2]}
>    done < $fname
> done < list_dbf

выдает всю строку и пишет cannot open


"разбор строки"
Отправлено Andrey Mitrofanov , 26-Окт-11 20:24 
>> #!/bin/bash
>> IFS='|'
> выдает всю строку и пишет cannot open

УМВР, ЧЯДНТ? //bash. я предупредил.

$ t() { echo '|Иванов Иван Иванович|город Москва|дом 3| |принято|'; }
$ IFS=\| a=(`t`)
$ for((i=0;i<${#a[*]};i++)); do echo "$i. '${a[$i]}'"; done
0. ''
1. 'Иванов Иван Иванович'
2. 'город Москва'
3. 'дом 3'
4. ' '
5. 'принято'
$ _


"разбор строки"
Отправлено qwertEHOK , 21-Окт-11 11:47 
> помогите, пожалуйста, со скриптом
> (система Sco unix)
> есть довольно большой файлик с таким содержимым
> |Иванов Иван Иванович|город Москва|дом 3| |принято|
> нужно взять текст между || и присвоить переменной
> количество полей около 20
> есть пустые строки

Ладно, тогда подскажите как все пробелы заменить на ХХХ
Лучше функцией

спасибо


"разбор строки"
Отправлено stereoPANDA , 21-Окт-11 12:29 
>> помогите, пожалуйста, со скриптом
>> (система Sco unix)
>> есть довольно большой файлик с таким содержимым
>> |Иванов Иван Иванович|город Москва|дом 3| |принято|
>> нужно взять текст между || и присвоить переменной
>> количество полей около 20
>> есть пустые строки
> Ладно, тогда подскажите как все пробелы заменить на ХХХ
> Лучше функцией
> спасибо

sed 's/ /XXX/g'


"разбор строки"
Отправлено qwertEHOK , 21-Окт-11 12:37 
всем спасибо

решил так

obr()
{
ff=`echo $1|cut -f $2 -d\|`
pole=`echo $ff|sed "s/ЪЩЪ/ /g"`
}

for fname in `cat itog.unl | sed "s/ /ЪЩЪ/g"`
do
    obr $fname 1
    echo $pole

    exit # для тестирования
done

заменяем пробелы на УНИКАЛЬНЫЕ символы
берем 1 строку
берем данные до первого |
удаляем уникальные символы

вроде хорошо ... но


"разбор строки"
Отправлено Аноним , 26-Окт-11 05:40 
ППЦ какой то :( Ох доберётся до вас гроза студней Андрей Митрофанов !

А вот так нельзя?

v@debian:~/work$ cat itog.unl
|Иванов Иван Иванович|город Москва|дом 3| |принято|
v@debian:~/work$ cat itog.unl | awk -v fld=2 'BEGIN {FS="|";} {print $fld;}'
Иванов Иван Иванович
v@debian:~/work$ cat itog.unl | awk -v fld=3 'BEGIN {FS="|";} {print $fld;}'
город мАсЬква
       ^^^ хумор такой :)
v@debian:~/work$ cat itog.unl | awk -v fld=6 'BEGIN {FS="|";} {print $fld;}'
принято

Ну и:
v@debian:~/work$ cat itog.unl | awk -v fld=500 'BEGIN {FS="|";} {print $fld;}'

v@debian:~/work$


"разбор строки"
Отправлено Ager , 26-Окт-11 13:28 
я предлогал использовать awk    но товарисч не ищет легких путей :)     видимо, в постановке задачи сказано - юзать awk - низзя :)      а огород из cut sed  - самое оно ....

"разбор строки"
Отправлено Andrey Mitrofanov , 26-Окт-11 21:39 
> ППЦ какой то :( Ох доберётся до вас гроза студней Андрей Митрофанов !

Не-а, у Митрофанова "другие проблемы", а Ж)) в постановке "со скриптом (система Sco unix)" - 1. мы все %) проиграли; 2. гуглить: позиксвей site:opennet.ru


"разбор строки"
Отправлено Ager , 26-Окт-11 23:24 
> в постановке "со скриптом (система Sco unix)" - 1. мы все %) проиграли

гы :)  как раз на SCO v3\v5 я и использовал awk в полный рост :)
а вот про cut узнал уже только на Linux`е ...