Автор Тема: Работа с текстом [РЕШЕНО]  (Прочитано 1567 раз)

Оффлайн romario

  • Участник
  • *
  • Сообщений: 621
    • ЮНИКС
Работа с текстом [РЕШЕНО]
« : 25.09.2012 12:44:37 »
Всем привет есть файл csv вида:
10-я линия;1
10-я линия;2
10-я линия;15
10-я линия;17
10-я линия;35
1-й проезд (Первомайский);2
1-й проезд (Первомайский);3
1-й проезд (Первомайский);6
1-й проезд (Первомайский);8
1-й проезд (Первомайский);12
1-й проезд (Первомайский);14
1-й проезд (Первомайский);41

необходимо чтобы из этого файла считывались строки, а в другой писались вот таким образом:

10-я линия;1;2;15;17;35
1-й проезд (Первомайский);2;3;6;8;12;14;41

как в bash это сделатья  примерно опнимаю, но есть одна загвоздка никак нему придумать как в bash определить положение сомвола ";"  чтобы правильно резать строки.
Поскажите пожалста.
« Последнее редактирование: 26.09.2012 16:18:54 от romario »

Оффлайн black

  • alt linux team
  • ***
  • Сообщений: 460
Re: работа с текстов
« Ответ #1 : 25.09.2012 13:02:07 »
man cut
смотри параметр -d

Оффлайн romario

  • Участник
  • *
  • Сообщений: 621
    • ЮНИКС
Re: работа с текстов
« Ответ #2 : 25.09.2012 13:18:59 »
не могу разобраться, может скинуть готовуб команду, мозг плавится уже.

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 368
Re: работа с текстов
« Ответ #3 : 25.09.2012 13:25:50 »
cut, наверное, не пойдёт. Так как положение плавает. Лучше sed.

Только на bash это не очень просто будет сделать, в ALT, по крайней мере: надо бы хэш использовать, а тут нужен bash 4.

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 159
    • Домашняя страница
Re: работа с текстов
« Ответ #4 : 25.09.2012 13:56:46 »
man bashИщите описание IFS и используйте read.
Андрей Черепанов (cas@)

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 368
Re: работа с текстов
« Ответ #5 : 25.09.2012 14:10:16 »
Да, идея с IFS лучше cut/sed. Но хэш, всё равно, тут просится. Хотя... Есть решение для bash 3. эдакий псевдо хэш. И я его использовал, забыл только. Сейчас попробую найти или описание, или свои заначки...

UPD:
http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
вот тут описание, но не подходит этот псевдохэш наверное... С полноценным хэшем можно в один проход было бы всё сделать, без предварительной сортировки.
« Последнее редактирование: 25.09.2012 19:11:44 от asy »

Оффлайн romario

  • Участник
  • *
  • Сообщений: 621
    • ЮНИКС
Re: работа с текстов
« Ответ #6 : 25.09.2012 15:20:05 »
чтойте и зачем он мне, я максимум смогу убрать не нужный мне символ, но нужно узнать его порядковый номер в строке, и самое главное с русскими буквами.

я тут нашел способ узнать положение символа в строке:
#!/bin/bash
line=dsfgsgrt:2345
echo $line
echo `expr index "$line" :`
вот вывод скрипта:
dsfgsgrt:2345
9

ну как только я начинаю работать с кирилицей, полается полная шизофрения:
code]#!/bin/bash
line=ваыпывкр:2345
echo $line
echo `expr index "$line" :`[/code]
тот же самый скрипт выводит не положение символа, а общее количество символов в строке:
ваыпывкр:2345
17

что делать?

IFS позволяет мне заменить : на пробел, ну мне это не нужно.

Оффлайн romario

  • Участник
  • *
  • Сообщений: 621
    • ЮНИКС
Re: работа с текстов
« Ответ #7 : 25.09.2012 16:43:07 »
вроде решил небольшую проблему вот скрипт:
#!/bin/bash

cat tempsar | while read line
do



 
echo $line
char1=:
posline=`echo $line | awk -vs=${char1} '{print index($0,s);}'`
testline=${line:0:$posline}
#echo $posline
#echo $testline
if [ "$testline" == "$oldline" ];
then
{
echo совпадение
echo ${line:$posline}
trueline="$trueline"_"${line:$posline}"

}
else
{
echo $trueline
echo $trueline >> /home/romario/sar
echo новая улица
trueline="$line"
}
fi
oldline="$testline"
echo $trueline
echo $oldline


done

берет из файла данные:
10-я линия:1
10-я линия:2
10-я линия:15
10-я линия:17
10-я линия:35
1-й проезд (Первомайский):2

записывает их в другой вид, в другйо файл:
10-я линия:1
_2
_15
_17
_35
1-й проезд (Первомайский):2

подскажите что не так делаю.

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 159
    • Домашняя страница
Re: работа с текстов
« Ответ #8 : 25.09.2012 16:46:51 »
[cas@cas ~]$ a='';IFS=';';cat ~/tmp/f | while read i v;do if [ "$a" != "$i" ]; \
then [ -n "$a" ] && echo; echo -n "$i"; a="$i"; fi; echo -n ";$v"; done; echo
10-я линия;1;2;15;17;35
1-й проезд (Первомайский);2;3;6;8;12;14;41
Андрей Черепанов (cas@)

Оффлайн romario

  • Участник
  • *
  • Сообщений: 621
    • ЮНИКС
Re: работа с текстов
« Ответ #9 : 25.09.2012 17:21:39 »
[cas@cas ~]$ a='';IFS=';';cat ~/tmp/f | while read i v;do if [ "$a" != "$i" ]; \
then [ -n "$a" ] && echo; echo -n "$i"; a="$i"; fi; echo -n ";$v"; done; echo
10-я линия;1;2;15;17;35
1-й проезд (Первомайский);2;3;6;8;12;14;41

спасибо, но к этому моменту я уже родил рабочий скрипт:
#!/bin/bash

cat tempsar | while read line
do

char1=:
posline=`echo $line | awk -vs=${char1} '{print index($0,s);}'`
testline=${line:0:$posline}
if [ "$testline" == "$oldline" ];
then
{
echo совпадение
ld=`echo ${line:$posline} | tr -d "\r"`
trueline="$trueline,$ld"
echo $trueline
}
else
{
echo $trueline
echo $trueline] | tr -d "\r" >> /home/romario/sar
echo новая улица
trueline="$line"
}
fi
oldline="$testline"



done

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 159
    • Домашняя страница
Re: работа с текстов
« Ответ #10 : 25.09.2012 17:55:20 »
спасибо, но к этому моменту я уже родил рабочий скрипт:
Пожалуйста, добавьте в тему первого соощения [решено]
Андрей Черепанов (cas@)