оболочка заменяет запятую на запятую - PullRequest
42 голосов
/ 04 января 2011

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

1
2
3
4
5

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

1,2,3,4,5

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

Ответы [ 8 ]

63 голосов
/ 04 января 2011

Попробуйте это:

tr '\n' ',' < input.txt > output.txt
17 голосов
/ 04 января 2011

С 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 символа в одной строке вывода);Я не уверен, что хотел бы продвинуть это сильнее, чем это.

11 голосов
/ 04 января 2011

В ответ на комментарий @ Джонатана к ответу @ eumiro:

tr -s '\r\n' ',' < input.txt | sed -e 's/,$/\n/' > output.txt
10 голосов
/ 05 января 2011

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

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

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

${string/#substring/replacement}
7 голосов
/ 06 января 2011
  • Версии 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*$//'

4 голосов
/ 09 сентября 2015

Использовать команду вставки. Вот использование труб:

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 позволяет определить символ разделителя.

1 голос
/ 22 марта 2018
  • версия Python:

    python -c 'import sys; print(",".join(sys.stdin.read().splitlines()))'

Нет проблемы с запятой (потому что join работает таким образом), а splitlines разбивает данные на собственные окончания строк (и удаляет их).

1 голос
/ 16 января 2015
cat input.txt | sed -e 's|$|,|' | xargs -i echo "{}"
...