Як згрупувати рядки у файлі по два?


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

Мені потрібно, щоб перша літера другого рядка була останньою в першому рядку ...
Костел Балта-Коман

Гарне використання простору утримування.
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-/може замінити обидва s /// можливо. Якби це було, це було б швидше, переносно для \ n використання та коротше.
mikeserv

1

Чистий баш-версія -

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.