У меня есть input.txt
1
2
3
4
5
Мне нужно получить такой файл output.txt
1,2,3,4,5
Как это сделать?
У меня есть input.txt
1
2
3
4
5
Мне нужно получить такой файл output.txt
1,2,3,4,5
Как это сделать?
Попробуйте следующее:
tr '\n' ',' < input.txt > output.txt
С помощью 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 символа в одной строке вывода); Я не уверен, что мне хотелось бы сделать это труднее, чем это.
tr
и sed
используются очень хорошо, но когда дело доходит до анализа файлов и регулярного выражения, вы не можете побить perl
(Не знаю, почему люди думают, что sed и tr ближе к оболочке, чем perl...)
perl -pe 's/\n/$1,/' your_file
если вы хотите, чтобы чистая оболочка выполняла его, посмотрите на соответствие строки
${string/#substring/replacement}
В ответ на комментарий @Jonathan к @eumiro ответьте:
tr -s '\r\n' ',' < input.txt | sed -e 's/,$/\n/' > output.txt
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*$//'
Используйте команду вставки. Здесь используются трубы:
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 позволяет определить символ разделителя.
cat input.txt | sed -e 's|$|,|' | xargs -i echo "{}"