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

Оболочка заменит cr\lf запятой

У меня есть input.txt

1
2
3
4
5

Мне нужно получить такой файл output.txt

1,2,3,4,5

Как это сделать?

4b9b3361

Ответ 1

Попробуйте следующее:

tr '\n' ',' < input.txt > output.txt

Ответ 2

С помощью sed вы можете использовать:

sed -e 'H;${x;s/\n/,/g;s/^,//;p;};d'

H добавляет пространство шаблонов в пространство удержания (сохранение текущей строки в пространстве удержания). ${...} окружает действия, применимые только к последней строке. Этими действиями являются: x подкачка и пространство шаблонов; s/\n/,/g заменить запятые вложенные новые строки; s/^,// удалить ведущую запятую (там есть новая строка в начале пространства удержания); и p печать. d удаляет пространство шаблона - нет печати. ​​

Вы также можете использовать, поэтому:

sed -n -e 'H;${x;s/\n/,/g;s/^,//;p;}'

-n подавляет печать по умолчанию, поэтому окончательный d больше не нужен.

Это решение предполагает, что окончание строк CRLF - это локальная собственная строка, заканчивающаяся (поэтому вы работаете с DOS), и поэтому sed генерирует локальную собственную строку, заканчивающуюся в операции печати. Если у вас есть вход в формате DOS, но вы хотите получить только формат Unix-формата (только LF), вам придется работать немного сложнее, но вам также необходимо четко указать это в вопросе.

Он работал нормально для меня на MacOS X 10.6.5 с номерами 1..5 и 1..50 и 1..5000 (23 893 символа в одной строке вывода); Я не уверен, что мне хотелось бы сделать это труднее, чем это.

Ответ 3

tr и sed используются очень хорошо, но когда дело доходит до анализа файлов и регулярного выражения, вы не можете побить perl (Не знаю, почему люди думают, что sed и tr ближе к оболочке, чем perl...)

perl -pe 's/\n/$1,/' your_file

если вы хотите, чтобы чистая оболочка выполняла его, посмотрите на соответствие строки

${string/#substring/replacement}

Ответ 4

В ответ на комментарий @Jonathan к @eumiro ответьте:

tr -s '\r\n' ',' < input.txt | sed -e 's/,$/\n/' > output.txt

Ответ 5

  • Версия Awk:
    • awk '{printf("%s,",$0)}' input.txt
    • awk 'BEGIN{ORS=","} {print $0}' input.txt
    • Выход - 1,2,3,4,5,

Поскольку вы запросили 1,2,3,4,5 по сравнению с 1,2,3,4,5, (обратите внимание на запятую после 5, большинство решений выше также содержат конечную запятую), вот еще две версии с Awk (с wc и sed), чтобы избавиться от последней запятой:

  • i='input.txt'; awk -v c=$(wc -l $i | cut -d' ' -f1) '{printf("%s",$0);if(NR<c){printf(",")}}' $i

  • awk '{printf("%s,",$0)}' input.txt | sed 's/,\s*$//'

Ответ 6

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

echo "1\n2\n3\n4\n5" | paste -s -d, /dev/stdin

Здесь используется файл:

echo "1\n2\n3\n4\n5" > /tmp/input.txt
paste -s -d, /tmp/input.txt

На man-страницах s объединяет все строки и d позволяет определить символ разделителя.

Ответ 7

cat input.txt | sed -e 's|$|,|' | xargs -i echo "{}"