Как обрабатывать ^M в csv файлах с помощью sed & awk?

Во-первых, проверьте, является ли это Процесс-зомби (который очень возможен):

ps -Al

Вы будете видеть что-то как:

0 Z  1000 24589     1  0  80   0 -     0 exit   ?        00:00:00 soffice.bin <defunct>

(Отметьте "Z" слева),

Если 5-й столбец не 1, то это означает, что это имеет родительский процесс. Попытайтесь уничтожить тот идентификатор родительского процесса.

Если его PPID = 1, не УНИЧТОЖАЙТЕ IT!!, думайте, который другие устройства или процессы могут быть связаны с ним.

Например, при использовании смонтированного устройства или самбы попытайтесь размонтировать ее. Это может выпустить Процесс-зомби.

Примечание: Если ps -Al (или top) показывает "D" вместо "Z", он мог быть связан с удаленным монтированием (как NFS). По моему опыту, перезагрузка является единственным способом пойти туда, но можно проверить другие ответы, которые касаются того случая более подробно.

3
27.10.2015, 04:11
3 ответа

Прежде всего, что ^ M - это возврат каретки ( \ r ), а не перевод строки ( \ n ). \ - это снова что-то другое, оно нужно для выхода из новой строки, поэтому программы синтаксического анализа csv не будут рассматривать его как конец записи.

На самом деле у вас есть файл, созданный в Windows, где конец строки определяется как \ r \ n , а не просто \ n , как у вас на * nix. Я не могу быть уверен, если вы не дадите нам отрывок из своего фактического файла, но если вы увидите ^ M \ в vim , за которым следует \ и затем новая строка, у вас, вероятно, есть \ r \\ n в файле. Итак, попробуйте следующее:

perl -i -pe 's/\r\\\n/ /'g file
4
27.01.2020, 21:19

Перед новой строкой стоит возврат каретки.
Вы можете s,. $ ,, в vim , чтобы удалить последний символ в любой строке.
Или вы можете s, ^ M $ ,, . Чтобы получить настоящий символ «^ M», а не регулярное выражение последовательности ^, M, $ , нажмите Ctrl V , затем нажмите Ctrl M .

1
27.01.2020, 21:19
 sed 's/\^M\\//g' filename

Экранирование метасимвола.

-1
27.01.2020, 21:19

Теги

Похожие вопросы