2013-07-27 3 views
0

Как я могу преобразовать одну строку, как показано ниже:Как заменить строку на экранирующий символ плюс строки в UNIX

794170|VWSD|AAA|e|h|i|j|STRING1|794170|VWSD|BBB|q|w|e|r|STRING2|794170|VWSD|CCC|z|x|c|v|STRING3|...and so on 

к новой строки-delimted,

Ожидаемый Выход:

794170|VWSD|AAA|e|h|i|j|STRING1| 
794170|VWSD|BBB|q|w|e|r|STRING2| 
794170|VWSD|CCC|z|x|c|v|STRING3| 

и так далее. BTW Я не эксперт по UNIX и просто хочу, чтобы шаги или простые команды решались. Ценю вашу помощь.

+1

Этот вопрос, как представляется, не по теме, поскольку речь идет о Unix/Bash и принадлежит на [unix.se] –

ответ

2

я предполагаю, у вас есть строка в файле с именем «х», то вы можете сделать это. Я использую символ «:», чтобы представить возврат каретки, который «sed» добавляет к вашей строке. Выберите что-то еще, если в вашей строке встречается «:». Затем «tr» изменяет «:» на возврат каретки. Вывод производится по вашему желанию, за исключением того, что в начале есть дополнительный возврат каретки.

cat x | sed 's/794170/:794170/g' | tr ':' "\n" 
+0

он работал помощником! Я бы просто изменил двоеточие: до серьезного акцента ('), поскольку в файле есть допустимые двоеточия, а также уникальные. –

1

Вы можете использовать fold команду:

$ fold -w32 file 
794170|VWSD|AAA|e|h|i|j|STRING1| 
794170|VWSD|BBB|q|w|e|r|STRING2| 
794170|VWSD|CCC|z|x|c|v|STRING3| 
+1

я не могу использовать раз, так как длина строк и символов различной для любой строки, кроме первого поле (794170) и второе поле (VWSD) всегда схожи для любой строки. –

+1

Единственной информацией, которую я собирался, был ваш пример, который ** является ** фиксированной шириной! Может быть, если вы действительно четко объясните свою проблему, вы бы получили подходящий ответ. Кто когда-либо проголосовал за этот ответ и проголосовал за @KitAlmario, комментарий должен быть читателем разума, поздравляет. –

0

Я не думаю, что вы можете сделать это с помощью простой команды. Существует несколько вариантов создания скриптов, которые могут разделять строки более или менее произвольно. Любой Unix будет иметь доступную утилиту awk. В большинстве систем вы также найдете Python и Perl. Я предполагаю, что скрипт Perl или Python - это самый простой способ разделить строки, подобные тому, который вы дали.

Это будет один из способов сделать это в Python

inline = "794170|VWSD|AAA|e|h|i|j|STRING1|794170|VWSD|BBB|q|w|e|r|STRING2|794170|VWSD|CCC|z|x|c|v|STRING3|" 

splits = ['794170' + s for s in inline.split('794170')] 

for s in splits[1:]: 
    print s 

794170|VWSD|AAA|e|h|i|j|STRING1| 
794170|VWSD|BBB|q|w|e|r|STRING2| 
794170|VWSD|CCC|z|x|c|v|STRING3| 
+0

fold, как предложено @sudo_O, будет работать, если ваши куски всегда фиксированной ширины. –

+0

К сожалению, поля столбцов меняются, как я упоминал с @sudo_O. Извините, я не знаком с Perl и Python, вы можете показать мне, как он используется здесь? Мне более удобно общаться с tr и awks, а sed (наименее). –

Смежные вопросы