The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Преобразование строк"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Преобразование строк"  
Сообщение от ПитерПен on 11-Июн-08, 19:24 
Всем здравствуйте!
Есть задача по преобразованию строк в файле.
В принципе решение нашел, но топорное, хочется получше, короче.

Есть file разделенный символом табуляции такого содержания


648797873102    11001
993508548876    11002
798383521741    11003
308811872484    11004
143199536718    11005
136264855505    11006
202132432902    11007
193345076713    11008
164112035686    11009
293774855572    11010

Его нужно привести к file3 виду

648 797 873 102    11001
993 508 548 876    11002
798 383 521 741    11003
308 811 872 484    11004
143 199 536 718    11005
136 264 855 505    11006
202 132 432 902    11007
193 345 076 713    11008
164 112 035 686    11009
293 774 855 572    11010

То есть разделить символами пробела левую часть file (пробел через три цифры, чтобы было четыре блока, по три цифры в блоке)
Вторая же часть файла (пять цифр) должна остаться неизменной и отделяться от левой символом табуляции. Но закавыка в том, что если так сделать, то получаем следующее

648 797 873 102 11001
993 508 548 876 11002
798 383 521 741 11003
308 811 872 484 11004
143 199 536 718 11005
136 264 855 505 11006
202 132 432 902 11007
193 345 076 713 11008
164 112 035 686 11009
293 774 855 572 11010

То есть символ табуляции внешне похож на простой сивол пробела, поэтому, нужно бы символ табуляции удвоить, чтобы зрительно правая часть все же была значительно отделена от левой части.
Сделал так
разделил первичный файл file на два файла file1(содержит левую часть file) и file2(содержит правую часть file)
cut -f 1 file > file1
cut -f 2 file > file2
и потом
sed  -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1 \2/;ta' file1 > file1.tmp
paste file1.tmp /dev/null file2 > file3

Так вот, можно ли это все сделать изящнее, в одно касание так сказать??

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Преобразование строк"  
Сообщение от phpcoder email(??) on 11-Июн-08, 19:34 
>Так вот, можно ли это все сделать изящнее, в одно касание так
>сказать??

sed 's|\(...\)\(...\)\(...\)\(...\) \(.\+\)|\1 \2 \3 \4\t\t\5|' file

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Преобразование строк"  
Сообщение от ПитерПен on 11-Июн-08, 19:57 
>>Так вот, можно ли это все сделать изящнее, в одно касание так
>>сказать??
>
>sed 's|\(...\)\(...\)\(...\)\(...\) \(.\+\)|\1 \2 \3 \4\t\t\5|' file

Хм.. чего-то у меня не получается - осталось также как и было, без изменений :((

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Преобразование строк"  
Сообщение от phpcoder email(??) on 11-Июн-08, 20:03 
>>>Так вот, можно ли это все сделать изящнее, в одно касание так
>>>сказать??
>>
>>sed 's|\(...\)\(...\)\(...\)\(...\) \(.\+\)|\1 \2 \3 \4\t\t\5|' file
>
>Хм.. чего-то у меня не получается - осталось также как и было,
>без изменений :((

Что значит не получается? Чтобы файл изменился добавьте опцию -i. Или у вас регулярное выржение не работает? Тогда уточните какая у вас ОС, например, потому как у меня всё работает:

[c0der@rock ~]$ sed 's|\(...\)\(...\)\(...\)\(...\) \(.\+\)|\1 \2 \3 \4\t\t\5|' TEST
648 797 873 102            11001
993 508 548 876            11002
798 383 521 741            11003
308 811 872 484            11004
143 199 536 718            11005
136 264 855 505            11006
202 132 432 902            11007
193 345 076 713            11008
164 112 035 686            11009
293 774 855 572            11010


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Преобразование строк"  
Сообщение от ПитерПен on 11-Июн-08, 20:24 
>>>>Так вот, можно ли это все сделать изящнее, в одно касание так
>>>>сказать??
>>>
>>>sed 's|\(...\)\(...\)\(...\)\(...\) \(.\+\)|\1 \2 \3 \4\t\t\5|' file
>Что значит не получается? Чтобы файл изменился добавьте опцию -i. Или у
>вас регулярное выржение не работает? Тогда уточните какая у вас ОС,
>например, потому как у меня всё работает:
>

Я и не сомневался, что у вас работает. Видимо у меня версия sed'а отличается от вашей, а ОС у меня FreeBSD
вот
man sed


     The -E, -a and -i options are non-standard FreeBSD extensions and may not
     be available on other operating systems.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Преобразование строк"  
Сообщение от phpcoder email(??) on 11-Июн-08, 20:40 
>Я и не сомневался, что у вас работает. Видимо у меня версия
>sed'а отличается от вашей, а ОС у меня FreeBSD

Так, а чего сразу-то не указали версию ОС? У меня-то Линукс. Я бы привел пример под Фряху, но она у меня только на работе доступна. Значит либо надо под ваш sed затачивать, либо использовать Perl:

perl -i -pe 's|(...)(...)(...)(...) (.+)|$1 $2 $3 $4\t\t$5|' file

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Преобразование строк"  
Сообщение от ПитерПен on 11-Июн-08, 21:04 
>Так, а чего сразу-то не указали версию ОС? У меня-то Линукс. Я
>бы привел пример под Фряху, но она у меня только на
>работе доступна. Значит либо надо под ваш sed затачивать, либо использовать
>Perl:
>
>perl -i -pe 's|(...)(...)(...)(...) (.+)|$1 $2 $3 $4\t\t$5|' file

От души спасибо!
Вы как всегда на высоте!
Разумеется перл еще как подойдет, посмотришь на ваши решения - все гениальное просто! :))

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Преобразование строк"  
Сообщение от madskull (??) on 16-Июн-08, 12:09 
а cut во фре есть?
cut -c -3,4-6,7-9,10- --output-delimiter=' ' file > file3

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Преобразование строк"  
Сообщение от phpcoder email(??) on 16-Июн-08, 12:16 
>а cut во фре есть?

Есть, но --output-delimiter не поддерживает.

>cut -c -3,4-6,7-9,10- --output-delimiter=' ' file > file3

Мсье знает толк ;-)


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру