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

Исходное сообщение
"добавить поле в середину строки при помощи sed или awk"

Отправлено Pojin , 11-Мрт-10 00:09 
что-то туплю вроде задача простая, если рассматривать как поля,но можно ли решить задачу автоматически текстовым редактором?
есть большой текстовый файл со строчками вида
слово1 слово2 слово3 итд
слово4 слово5 слово6 итд
нужно после второго слова на каждой строчке(слова разные) вставить точку с запятой
думал банально заменить sed-ом,пробел на точку с запятой,но блин пробелов там много нужных

Содержание

Сообщения в этом обсуждении
"добавить поле в середину строки при помощи sed или awk"
Отправлено phpcoder , 11-Мрт-10 06:59 
>есть большой текстовый файл со строчками вида
>слово1 слово2 слово3 итд
>слово4 слово5 слово6 итд
>нужно после второго слова на каждой строчке(слова разные) вставить точку с запятой

$ sed 's|^\([^ ]\+ [^ ]\+\)\( .*\)$|\1;\2|' test.txt
слово1 слово2; слово3 итд
слово4 слово5; слово6 итд


"добавить поле в середину строки при помощи sed или awk"
Отправлено phpcoder , 11-Мрт-10 08:37 
>[оверквотинг удален]
>>>слово1 слово2 слово3 итд
>>>слово4 слово5 слово6 итд
>>>нужно после второго слова на каждой строчке(слова разные) вставить точку с запятой
>>
>>$ sed 's|^\([^ ]\+ [^ ]\+\)\( .*\)$|\1;\2|' test.txt
>>слово1 слово2; слово3 итд
>>слово4 слово5; слово6 итд
>
>товарисчи! асвойте уже перл - там такие весчи делать просто ВААХ КААК
>ХАРАШО!

На Perl-е почти также:

$ perl -wpe 's|^([^\s]+ [^\s]+)( .*)$|$1;$2|' test.txt
слово1 слово2; слово3 итд
слово4 слово5; слово6 итд

Но автор просил на sed/awk.



"добавить поле в середину строки при помощи sed или awk"
Отправлено Pahanivo , 11-Мрт-10 09:02 
>[оверквотинг удален]
>>товарисчи! асвойте уже перл - там такие весчи делать просто ВААХ КААК
>>ХАРАШО!
>
>На Perl-е почти также:
>
>$ perl -wpe 's|^([^\s]+ [^\s]+)( .*)$|$1;$2|' test.txt
>слово1 слово2; слово3 итд
>слово4 слово5; слово6 итд
>
>Но автор просил на sed/awk.

s/^(\s*\S+\s+\S+)(.*)$/$1;$2/
также можно поизвращатся с метой \b (граница слова), но я не помню как он робит

ЗЫ да можно и сидом, но сам сид пишется на перле двумя строчками цикла чтения с stdin + одна строчка на каждую нужную обработку.
я не отрицаю прелестей сид, но всетаки перлом тексты рулит удобнее, намного удобнее


"добавить поле в середину строки при помощи sed или awk"
Отправлено L0n3R4ng3r , 11-Мрт-10 10:52 
>что-то туплю вроде задача простая, если рассматривать как поля,но можно ли решить
>задачу автоматически текстовым редактором?
>есть большой текстовый файл со строчками вида
>слово1 слово2 слово3 итд
>слово4 слово5 слово6 итд
>нужно после второго слова на каждой строчке(слова разные) вставить точку с запятой
>
>думал банально заменить sed-ом,пробел на точку с запятой,но блин пробелов там много
>нужных

cat /tmp/test
слово1 слово2 слово3 итд
слово4 слово5 слово6 итд

PERL :
cat /tmp/test |  perl -ne 'my($a,$b,$c) = split(/\s+/,$_); print "$a $b; $c\n"'
слово1 слово2; слово3
слово4 слово5; слово6

AWK :
cat /tmp/test |  awk '{$2 = $2";" ; print $0}'
слово1 слово2; слово3 итд
слово4 слово5; слово6 итд



"добавить поле в середину строки при помощи sed или awk"
Отправлено L0n3R4ng3r , 11-Мрт-10 10:55 
FIXED:
perl -ne 'my($a,$b,@c) = split(/\s+/,$_); print "$a $b; @c\n"'

"добавить поле в середину строки при помощи sed или awk"
Отправлено Pahanivo , 11-Мрт-10 12:01 
>FIXED:
>perl -ne 'my($a,$b,@c) = split(/\s+/,$_); print "$a $b; @c\n"'

На опене народ любит меряться пиписьками. Правда айтишнегов отличает тот факт, что лучшей длинной считается наименьшая, да и внешний вид не на последнем месте. Высшим же достижение считается завязать в узел так, что бы никто не понял как ))


"добавить поле в середину строки при помощи sed или awk"
Отправлено L0n3R4ng3r , 11-Мрт-10 13:32 
>Высшим же достижение считается завязать в узел так, что бы
>никто не понял как ))

ИМХО я не считаю что примерно сложный для понимания ;)
всего 2 действия
1. режиться на три части с помощью split'a (слово,слово и все остальное)
2. выводиться все с ';' :)

все просто :)


"добавить поле в середину строки при помощи sed или awk"
Отправлено Pahanivo , 11-Мрт-10 15:40 
>>Высшим же достижение считается завязать в узел так, что бы
>>никто не понял как ))
>
>ИМХО я не считаю что примерно сложный для понимания ;)
>всего 2 действия
>1. режиться на три части с помощью split'a (слово,слово и все остальное)
>
>2. выводиться все с ';' :)
>
>все просто :)

ненене, я не в коем разе не утверждаю что тут есть чтото сложно ))
все понятно и прозрачно

я собстна про "померятся лубят" ))


"добавить поле в середину строки при помощи sed или awk"
Отправлено Andrey Mitrofanov , 11-Мрт-10 13:26 
>|  awk '{$2 = $2";" ; print $0}'

Упс, сорри. Поторопился, не дочитал.


"добавить поле в середину строки при помощи sed или awk"
Отправлено Andrey Mitrofanov , 11-Мрт-10 13:23 
>есть большой текстовый файл со строчками вида
>слово1 слово2 слово3 итд
>слово4 слово5 слово6 итд
>нужно после второго слова на каждой строчке(слова разные) вставить точку с запятой

|awk '{$2=$2";";print}'

:) И нет перлом не проще -- его _учить надо, а он _стра-а-ашный_! :-P


"добавить поле в середину строки при помощи sed или awk"
Отправлено Pahanivo , 11-Мрт-10 15:49 
>:) И нет перлом не проще -- его _учить надо, а он
>_стра-а-ашный_! :-P

Страааашна, аж жуть! (С)

Вот вам hand-made sed :)
Мож кто еще не знает:

#! /usr/bin/perl -w
#usage: ./script < scr_file > dst_file
while ($from_stdin_string = <>) {
  #some_regex with $from_stdin_string;
  #some_regex with $from_stdin_string;
  #some_regex with $from_stdin_string;
  ...
}


"добавить поле в середину строки при помощи sed или awk"
Отправлено Andrey , 14-Мрт-10 05:26 
интересная статья о разных алгоритмах использующихся для обработки регулярных выражений.
http://swtch.com/~rsc/regexp/regexp1.html