Jak grupować linie w pliku według dwóch?


9

Mam taki plik tekstowy:

a
b
c
d
e
f
g

Jak pogrupować te wiersze, aby uzyskać dane wyjściowe takie jak to:

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

Muszę to zrobić w powłoce (sh, csh, bash).

Znalazłem to:

cat file | xargs -n2

ale ostatni element pierwszej grupy nie stał się pierwszym z drugiego.

Odpowiedzi:


9

Z awk:

awk 'NR!=1{print x"-"$0}{x=$0}' file
  • NR!=1 dotyczy wszystkich linii, z wyjątkiem pierwszej
  • print x"-"$0 wypisz wartości z myślnikiem pomiędzy
  • x=$0zestaw x(do następnej iteracji)

5

Z POSIX sed:

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

lub wersja jednowarstwowa:

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

Potrzebuję pierwszej litery drugiego wiersza, aby była ostatnią w pierwszym wierszu ...
Costel Balta-Coman

Ładne wykorzystanie przestrzeni ładunkowej.
Wildcard

tak, w porządku.
mikeserv

Czy możesz wyjaśnić, jak to działa?
Yossarian

5
paste -d- - ./infile <infile

^ To by działało naprawdę dobrze, z tym wyjątkiem, że twoje dane wejściowe byłyby wyłączone. Więc...

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

... działałoby, ale może jest zbyt skomplikowane ...


Cóż, dokładnie to samo przyszło mi do głowy po błędnym odczytaniu wymagań OP, ale postanowiłem pozwolić sedsobie na to sam.
cuonglm

@cuonglm - czy źle go odczytałem?
mikeserv

1
Nie, założę się. Ale musisz sed 1d\;\$dto poprawić.
cuonglm

Co powiesz na ten wariant? sed '2~2p' infile | paste -d- - -
steeldriver

1
Teraz widzę. paste -d- <(head -n -1 input) <(tail -n +2 input)
Costas

2

Jeszcze jeden sed

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

i może być modyfikowany (dzięki mikeserv ):

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

1
y/-\n/\n-/może zastąpić oba s /// może. Gdyby tak było, byłoby to szybsze, przenośne do użytku \ n i krótsze.
mikeserv

1

Wersja czysto bashowa -

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.