транспонировать данные в строке через запятую

1

У меня есть файл, который имеет данные в одном столбце и 200 строк (200 * 1).

Я хочу получить эти данные в одной строке с разделенной запятой.

Файл примера

Paul
Pammy
Jacob
Robin 

Вывод

Paul, Pammy, Jacob, Robin
Теги:

6 ответов

5
Лучший ответ

Использование sed:

sed ':a;{N;s/\n/, /};ba' INPUT_FILE

Объяснение:

Я не эксперт по sed, но это то, что означает вышеупомянутый однострочный:

  1. :a

    :label команда :label создает именованный ярлык a. Это при использовании с ветвями ba на этикетке. Это полезно для создания циклов и перехода в конец сценария для печати текущего пространства шаблонов.

  2. N

    N просто добавляет следующую строку в пространство шаблонов с помощью \n.

  3. s/\n/,/

    Поскольку новая строка была добавлена к шаблону с \n, мы используем эту замену, чтобы заменить \n с А , и space в соответствии с требованиями ОП.

Контрольная работа:

[jaypal:~/Temp] cat file
Paul
Pammy
Jacob
Robin

[jaypal:~/Temp] sed ':a;{N;s/\n/, /};ba' file
Paul, Pammy, Jacob, Robin
  • 0
    Выглядит хорошо отсюда, но есть ли шанс, что вы могли бы объяснить немного лучше? Я даже не понимаю, и последнее, что нужно этому миру, - это еще одна загадочная команда sed . :П
  • 0
    Добавил объяснение. :)
Показать ещё 5 комментариев
4

awk:

$ awk -v ORS=, 1 file.txt | sed 's/,$/\n/'
Paul,Pammy,Jacob,Robin
  • -v ORS=, установить выходную запись, разделенную ,
  • 1 ИСТИНА, поэтому распечатывайте каждую запись
  • sed 's/,$/\n/' remove end ,

sed:

$ sed -n '1h;1!H;${g;s/\n/,/gp}' file.txt
Paul,Pammy,Jacob,Robin
  • -n подавляет выход
  • 1h помещает первую строку в пространство-держатель
  • 1!H добавить второй ~ последние строки в пространство удержания
  • ${...} do... против последней строки
  • g получить все из холдинга
  • s/\n/,/g заменить \n на ,
  • p распечатывают

tr:

$ tr '\n' ',' <file.txt | sed 's/,$/\n/'
  • 0
    Мы можем удалить cat из tr версии и просто сделать tr '\n' ',' < file.txt | sed 's/,$/\n/'
  • 0
    @JaypalSingh Да.
Показать ещё 2 комментария
2

это, похоже, работает, использует команду "tr" для unix/linux

tr '\n', ',' < yourfile
1

В Python

  ', '.join(open("yourinputfile").read().splitlines())

В Баше

 cat test.txt|xargs -I {} echo -n {},
0

В Perl:

perl -pe 'chomp; print ", " if $. - 1' 
0

Это может сработать для вас:

paste -d, -s file.txt

Ещё вопросы

Сообщество Overcoder
Наверх
Меню