Объединение двух последовательных строк в одну (поиск решения, работающего и с файлами Windows)

Я хотел бы объединить две последовательные строки в текстовом файле Windows, используя внешнюю среду bash, например ту, которую предоставляют Cygwin или MobaXTerm.

Я знаю, что подобные вопросы задавались и уже были решены, но по какой-то причине они не работают с моей средой. Возможно, потому что Windows добавляет некоторые невидимые символы, не распознаваемые инструментами bash?

Вот решения других подобных вопросов, которые я уже пробовал:

awk 'NR%2{a=$0;next}{print a","$0}' test.txt

grep "line"  test.txt |awk 'NR==0{prefix=$0;next} {print prefix, $0}'

sed '$!N;s/\n/,/' test.txt

Вход, с которым я работаю:

first line
second line
third line
fourth line
fifth line
sixth line

Ожидаемый результат:

first line,second line
third line,fourth line
fifth line,sixth line

Фактический результат с любым кодом, который я пробовал до сих пор:

1)

➤ sed '$!N;s/\n/,/' test.txt

,second line

,fourth line

,sixth line

2)

➤ grep "line"  test.txt |awk 'NR==0{prefix=$0;next} {print prefix, $0}'

first line

second line

third line

 fourth line

 fifth line

 sixth line

Любая помощь здесь будет принята с благодарностью.

Вы показали ожидаемый результат, но не ввод, который привел бы к этому результату. редактировать ваш вопрос, чтобы включить образец ввода для этого вывода. Wrt Is it perhaps cos Windows is adding some invisible characters unrecognized by bash tools - возможно, см. stackoverflow.com/q/45772525/1745001, как определить и справиться с этим.

Ed Morton 22.05.2019 15:03

Я верю, что это довольно очевидно, не так ли? Это всего лишь 6 последовательных строк, т.е. практически то же самое, что вы видите в моем выводе с помощью grep. Но хорошо, я добавлю это к вопросу, так как люди, кажется, упускают его.

Martin Ledermann 22.05.2019 15:05

Кто-то должен создать для нас входной файл, чтобы протестировать потенциальное решение. Возможны следующие варианты: 1) это делаете вы или 2) это делают все, кто пытается вам помочь. 1 имеет гораздо больше смысла, чем 2.

Ed Morton 22.05.2019 15:07

Ага, это я понимаю, я просто говорю, что входной файл уже был. :)

Martin Ledermann 22.05.2019 15:10
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
4
68
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий
$ cat -v file
first line^M
second line^M
third line^M
fourth line^M
fifth line^M
sixth line^M

С GNU awk для многосимвольного RS:

$ awk -v RS='\r?\n' -v OFS=',' 'NR%2{p=$0; next} {print p, $0}' file
first line,second line
third line,fourth line
fifth line,sixth line

С любым awk:

$ awk -v OFS=',' '{sub(/\r$/,"")} NR%2{p=$0; next} {print p, $0}' file
first line,second line
third line,fourth line
fifth line,sixth line

cat -v не распознается MobaXTerm, но ваше второе решение работает блестяще! Большое спасибо, милостивый государь :)

Martin Ledermann 22.05.2019 15:11

с ГНУ sed -

$: cat in
0
1
2
3
4
5
6
7
8
9

$: sed 'N; s/\r*\n/,/; p; d;' in # no dash-options needed
0,1
2,3
4,5
6,7
8,9

N; - добавить следующую строку к текущей
s/\r*\n/,/; - заменить любые CR и символ новой строки на запятую
p; - распечатать результат
d; - удалите его, чтобы sed не печатал автоматически.

Тот же вывод с

$: sed -En 'N; s/\r?\n/,/; p;' in 

это -Eрасширенное сопоставление с образцом, -nавтопечать.

Очень простое решение — использовать пасту:

cat > FILE <<EOF
first line
second line
third line
fourth line
fifth line
sixth line

Потом:

▶ paste -d, - - < FILE
first line,second line
third line,fourth line
fifth line,sixth line

Дальнейшее объяснение:

  • Утилита paste объединяет соответствующие строки заданных входных файлов. Если для каких-либо файлов указан -, используется STDIN, и он читается циклически, по одной строке за раз, для каждого экземпляра -.

  • -d, указывает пасте использовать , в качестве разделителя полей вместо символа табуляции по умолчанию.

Альтернатива paste -sd',\n' file.

potong 22.05.2019 23:57

@potong, это не работает с моей пастой (BSD, Mac OS X). Я предполагаю, что это версия GNU?

Alex Harvey 23.05.2019 00:03

вот одно awk решение

awk 'NR%2==1{x=$0;next}{print x "," $0}' file

выход

first line,second line
third line,fourth line
fifth line,sixth line

Другие вопросы по теме