использование sed для изменения ‹CR›‹LF› на символ

Я работаю над Windows Vista с GnuWin32 (sed 4.2.1 и основные утилиты 5.3.0). Также есть пакет ActivePerl 5.14.2.

У меня есть большой файл с несколькими записями. Конец каждой записи в файле обозначается четырьмя знаками доллара ($$$$). Внутри каждой логической записи много "CRLF".

Я хотел бы заменить все экземпляры CRLF таким символом, как |+|. Затем я заменю $$$$ на CRLF. Результат: одна запись на строку для импорта в Excel для дальнейшей обработки.

Я пробовал несколько способов преобразования CRLF в |+|, но безуспешно.

Например, одним из методов был: sed -e "s/[\r\n]/|+|/g" source_file_in target_file_out

Другой метод использовал tr -d для удаления \r, а затем второй оператор: sed -e "s/\n/|+|/g" source_file_in target_file_out

Оператор tr сработал; оператор sed этого не сделал.

Я прочитал следующие статьи, но не вижу, как их адаптировать, чтобы заменить \r\n на такой символ, как |+|.

sed: как заменить CR и/или LF на \r \n, чтобы любой файл был в одной строке

Заменить строку, содержащую CRLF?

Как заменить новую строку (\n) с помощью sed?

Если эту проблему нельзя легко решить с помощью sedtr), тогда я воспользуюсь Perl, если кто-нибудь покажет мне, как это сделать.


Спасибо, Эд, за рекомендацию.

Сценарий awk еще не работает полностью, поэтому я добавлю некоторые недостающие детали в надежде, что вы сможете точно настроить свою рекомендацию.

Во-первых, я запускаю gawk v3.1.6.2962. Я считаю, что могут быть различия в реализациях awk, так что это может быть полезной информацией.

Далее еще немного информации о типе данных и происхождении данных.

Данные о химических веществах (текстовые данные, которые вводятся в программу стереохимического рисования).

Химические файлы имеют формат .sdf.

Когда я открываю «133711.sdf» в NotePad++ (используя «Просмотр/Показать символ/Показать все символы»), я вижу данные, показанные на снимке экрана: https://dl.dropbox.com/u/3094317/_master|+|screen_shot_.png

Как видите, только LF - без CR. Я считаю, что это означает, что источником файлов .sdf является система UNIX.

Затем я запускаю команду Windows COPY *.sdf _master$$$$.txt. Это создает очень большой файл файлов, который я хочу разобрать на записи.

_master$$$$.txt имеет ту же структуру, что и 133711.sdf — только LF; нет КР.

Затем я запускаю вашу рекомендацию awk в файле .BAT. Мне нужно заменить ваши одинарные кавычки на двойные, потому что Microsoft сделала меня.

awk -v FS="\r\n" -v OFS="|+|" -v RS="\$\$\$\$" -v ORS="\r\n" "{$1=$1}1" C:_master$$$$.txt >C:\output.txt

Я приложил скриншот output.txt: https://dl.dropbox.com/u/3094317/output.txt.png

Как видите, команда awk не смогла успешно заменить "\r\n" на "|+|".

Кроме того, Windows создала файл output.txt с помощью CRLF.

Он успешно заменил четыре $ на CRLF.

Достаточно ли этой информации для обновления вашей рекомендации awk для решения проблем, связанных с Windows?


person user2028514    schedule 31.01.2013    source источник
comment
Я бы предложил сначала использовать sed/awk для форматирования текста вопроса...   -  person Kent    schedule 31.01.2013
comment
Ваш вопрос игнорируется, потому что он ужасно отформатирован. Прочтите часто задаваемые вопросы.   -  person Chris Seymour    schedule 31.01.2013
comment
sed — отличный инструмент для простых замен в одной строке. Для всего остального используйте awk.   -  person Ed Morton    schedule 31.01.2013


Ответы (1)


Попробуйте это с GNU awk:

awk -v FS='\r\n' -v OFS='|+|' -v RS='\\$\\$\\$\\$' -v ORS='\r\n' '{$1=$1}1' file

Из вашего обновленного вопроса я вижу, что вы работаете в Windows. Чтобы избежать нелепых правил и проблем с цитированием, поместите это в файл с именем «whatever.awk»:

BEGIN{FS="\r\n"; OFS="|+|"; RS="\\$\\$\\$\\$"; ORS="\r\n"} {$1=$1}1

и запустить его как

awk -f whatever.awk file

и посмотрите, делает ли это то, что вы хотите.

person Ed Morton    schedule 31.01.2013
comment
Спасибо, Эд, за рекомендацию. Сценарий awk еще не работает полностью, поэтому я добавлю некоторые недостающие детали в надежде, что вы сможете точно настроить свою рекомендацию. Я объяснил входы и выходы здесь - ввод-вывод длиннее, чем разрешено в разделе комментариев моего исходного вопроса. dl.dropbox.com/u/3094317/_follow_up_post_.mht - person user2028514; 31.01.2013
comment
Не помещайте свой образец ввода и ожидаемый результат на какой-либо другой сайт или в раздел комментариев к исходному сообщению. Просто отредактируйте свой исходный пост, чтобы предоставить недостающую информацию. - person Ed Morton; 31.01.2013
comment
@user2028514 user2028514 - я обновил свой ответ, чтобы показать вам, как избежать проблем с цитированием окон. - person Ed Morton; 01.02.2013