Подтвердить что ты не робот

Заменить пробел запятой в текстовом файле в Linux

Мне нужно отредактировать несколько текстовых файлов (вывод из sar) и преобразовать их в файлы CSV.

Мне нужно изменить все пробелы (возможно, это вкладка между номерами в выходе) с помощью функций sed или awk (простая оболочка script в Linux).

Может ли кто-нибудь мне помочь? Каждая используемая мной команда вообще не меняла файл; Я попробовал gsub.

4b9b3361

Ответ 1

tr ' ' ',' <input >output 

Заменяет каждое пространство запятой, если вам нужно, вы можете сделать проход с флагом -s (сжать повторы), который заменяет каждую входную последовательность повторяющегося символа, который указан в SET1 (пустое пространство), с одним появление этого символа.

Использование повторов сжимания, используемых после замещающих вкладок:

tr -s '\t' <input | tr '\t' ',' >output 

Ответ 2

Попробуйте что-то вроде:

sed 's/[:space:]+/,/g' orig.txt > modified.txt

Класс символов [: пробел:] будет соответствовать всем пробелам (пробелы, табы и т.д.). Если вы просто хотите заменить один символ, например. просто коснитесь, используйте это только.

EDIT: На самом деле [: пробел:] включает возврат каретки, поэтому это может не делать то, что вы хотите. Следующие слова заменяют вкладки и пробелы.

sed 's/[:blank:]+/,/g' orig.txt > modified.txt

как и

sed 's/[\t ]+/,/g' orig.txt > modified.txt

Во всем этом вам нужно быть осторожным, чтобы элементы в вашем файле, разделенные пробелами, не содержали их собственные пробелы, которые вы хотите сохранить, например. два слова.

Ответ 3

не глядя на ваш входной файл, только предположение

awk '{$1=$1}1' OFS=","

перенаправить на другой файл и переименовать при необходимости

Ответ 4

Что-то вроде этого:

cat texte.txt | sed -e 's/\s/,/g' > texte-new.txt

(Да, с некоторыми бесполезными котами и трубопроводами, также можно использовать < для чтения из файла напрямую, я полагаю, - сначала использовал cat для вывода содержимого файла, и только после этого я добавил sed в свою команду -линии)

РЕДАКТИРОВАТЬ:, как указал @ghostdog74 в комментарии, определенно нет необходимости в cat/pipe; вы можете указать имя файла sed:

sed -e 's/\s/,/g' texte.txt > texte-new.txt

Если "texte.txt":

$ cat texte.txt
this is a text
in which I want to replace
spaces by commas

Вы получите "texte-new.txt", который будет выглядеть следующим образом:

$ cat texte-new.txt
this,is,a,text
in,which,I,want,to,replace
spaces,by,commas

Я бы не стал просто заменять старый файл на новый (может быть сделано с sed -i, если я правильно помню, и, как сказал @ghostdog74, этот согласился бы на создание резервной копии на лету): сохранение может быть разумным, в качестве меры безопасности (даже если это означает, что нужно переименовать его в нечто вроде "texte-backup.txt" )

Ответ 5

Эта команда должна работать:

sed "s/\s/,/g" < infile.txt > outfile.txt

Обратите внимание, что вам нужно перенаправить вывод в новый файл. Входной файл не изменяется на месте.

Ответ 6

sed может сделать это:

sed 's/[\t ]/,/g' input.file

Это отправит на консоль,

sed -i 's/[\t ]/,/g' input.file

отредактирует файл на месте

Ответ 7

Здесь Perl script, который будет редактировать файлы на месте:

perl -i.bak -lpe 's/\s+/,/g' files*

Последовательные пробелы преобразуются в одну запятую.
Каждый входной файл перемещается в .bak

Используются следующие параметры командной строки:

  • -i.bak редактировать на месте и делать копии .bak

  • -p перемещаться по каждой строке входного файла, автоматически печатать строку

  • -l удаляет новые строки перед обработкой и добавляет их обратно

  • -e выполнить код perl

Ответ 8

Если вы хотите заменить произвольную последовательность пустых символов (табуляция, пробел) одной запятой, используйте следующее:

sed 's/[\t ]+/,/g' input_file > output_file

или же

sed -r 's/[[:blank:]]+/,/g' input_file > output_file

Если некоторые из ваших строк ввода содержат начальные пробелы, которые являются избыточными и не нуждаются в преобразовании в запятые, то сначала вам нужно избавиться от них, а затем преобразовать оставшиеся пустые символы в запятые. Для такого случая используйте следующее:

sed 's/ +//' input_file | sed 's/[\t ]+/,/g' > output_file