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

Я хотел бы объединить две последовательные строки в текстовом файле 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

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

Ответы [ 4 ]

1 голос
/ 22 мая 2019

с GNU 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 o автопечать.

1 голос
/ 22 мая 2019
$ 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
0 голосов
/ 22 мая 2019

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

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

выход

first line,second line
third line,fourth line
fifth line,sixth line
0 голосов
/ 22 мая 2019

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

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, указывает пасте использовать , в качестве разделителя полей вместо символа табуляции по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...