Всем здравствуйте!
Есть задача по преобразованию строк в файле.
В принципе решение нашел, но топорное, хочется получше, короче.Есть 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Так вот, можно ли это все сделать изящнее, в одно касание так сказать??
>Так вот, можно ли это все сделать изящнее, в одно касание так
>сказать??sed 's|\(...\)\(...\)\(...\)\(...\) \(.\+\)|\1 \2 \3 \4\t\t\5|' file
>>Так вот, можно ли это все сделать изящнее, в одно касание так
>>сказать??
>
>sed 's|\(...\)\(...\)\(...\)\(...\) \(.\+\)|\1 \2 \3 \4\t\t\5|' fileХм.. чего-то у меня не получается - осталось также как и было, без изменений :((
>>>Так вот, можно ли это все сделать изящнее, в одно касание так
>>>сказать??
>>
>>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
>>>>Так вот, можно ли это все сделать изящнее, в одно касание так
>>>>сказать??
>>>
>>>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.
>Я и не сомневался, что у вас работает. Видимо у меня версия
>sed'а отличается от вашей, а ОС у меня FreeBSDТак, а чего сразу-то не указали версию ОС? У меня-то Линукс. Я бы привел пример под Фряху, но она у меня только на работе доступна. Значит либо надо под ваш sed затачивать, либо использовать Perl:
perl -i -pe 's|(...)(...)(...)(...) (.+)|$1 $2 $3 $4\t\t$5|' file
>Так, а чего сразу-то не указали версию ОС? У меня-то Линукс. Я
>бы привел пример под Фряху, но она у меня только на
>работе доступна. Значит либо надо под ваш sed затачивать, либо использовать
>Perl:
>
>perl -i -pe 's|(...)(...)(...)(...) (.+)|$1 $2 $3 $4\t\t$5|' fileОт души спасибо!
Вы как всегда на высоте!
Разумеется перл еще как подойдет, посмотришь на ваши решения - все гениальное просто! :))
а cut во фре есть?
cut -c -3,4-6,7-9,10- --output-delimiter=' ' file > file3(понятно, что уже почти неделя прошла... но как пример альтернативы пойдет)
>а cut во фре есть?Есть, но --output-delimiter не поддерживает.
>cut -c -3,4-6,7-9,10- --output-delimiter=' ' file > file3
Мсье знает толк ;-)