Как сгруппировать строки в файле по двум?


9

У меня есть текстовый файл, как это:

a
b
c
d
e
f
g

Как я могу сгруппировать эти строки, чтобы получить вывод, как это:

a-b
b-c
c-d
d-e
e-f
f-g

Я должен сделать это в оболочке (sh, csh, bash).

Я нашел это:

cat file | xargs -n2

но последний элемент первой группы не стал первым из второй.

Ответы:


9

С awk:

awk 'NR!=1{print x"-"$0}{x=$0}' file
  • NR!=1 применяется ко всей строке, кроме первой
  • print x"-"$0 печатать значения с тире между
  • x=$0установить x(для следующей итерации)

5

С POSIX sed:

sed '1{
  h
  d
}
H
x
s/\n/-/
' <file

или однострочная версия:

sed -e '1{h;d' -e\} -e 'H;x;s/\n/-/' <file

Мне нужно, чтобы первая буква второй строки была последней в первой строке ...
Costel Balta-Coman

Хорошее использование пространства трюма.
Wildcard

да, это хорошо.
mikeserv

Не могли бы вы объяснить, как это работает?
Йоссариан

5
paste -d- - ./infile <infile

^ Это сработало бы очень хорошо, за исключением того, что ваш вклад был одно за другим. Так...

{ echo; cat <infile; } | paste -d- - ./infile | sed '1d;$d'

... будет работать, но, возможно, это слишком сложно ...


Ну, это точно то же самое, что пришло мне в голову после неправильного прочтения требования ОП, но я решил оставить sedэто в покое.
cuonglm

@cuonglm - я неправильно это понял?
mikeserv

1
Нет, держу пари Но вам нужно sed 1d\;\$dисправить это.
cuonglm

Как насчет этого варианта? sed '2~2p' infile | paste -d- - -
SteelDriver

1
Теперь я вижу. paste -d- <(head -n -1 input) <(tail -n +2 input)
Костас

2

Еще sed

sed '$!N;s/\n/-/p;s/-/\n/;D' <input

и может быть изменено (благодаря mikeserv ):

sed -n 'N;y/\n/-/;P;y/-/\n/;D' <input

1
y/-\n/\n-/может заменить оба с /// возможно. Если бы это было так, это было бы быстрее, переносимо для использования \ n и короче.
mikeserv

1

Чистая версия Bash -

old=""; while read -r line ; do [[ -n "$old" ]] && echo   $old-$line;   old=$line; done  < input

a-b
b-c
c-d
d-e
e-f
f-g
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.