Я работаю над 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?
Если эту проблему нельзя легко решить с помощью sed
(и tr
), тогда я воспользуюсь 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?