Dosyadaki satırları ikiye nasıl gruplayabilirim?


9

Ben böyle bir metin dosyası var:

a
b
c
d
e
f
g

Nasıl böyle bir çıktı elde etmek için bu satırları gruplandırabilirim:

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

Bunu kabukta yapmalıyım (sh, csh, bash).

Bunu buldum:

cat file | xargs -n2

ancak birinci grubun son unsuru ikincinin ilk unsuru olmamıştır.

Yanıtlar:


9

İle awk:

awk 'NR!=1{print x"-"$0}{x=$0}' file
  • NR!=1 ilki hariç tüm hatlara uygulanır
  • print x"-"$0 değerleri arasında tire işareti ile yazdır
  • x=$0set x(sonraki yineleme için)

5

POSIX ile sed:

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

veya tek katmanlı versiyon:

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

İkinci satırın ilk harfinin ilk satırdaki son harf olması gerekir ...
Costel Balta-Coman

Bekletme alanının güzel kullanımı.
Wildcard

evet, sorun değil.
16:16

Bunun nasıl çalıştığını açıklayabilir misiniz?
Yossarian

5
paste -d- - ./infile <infile

^ Bu, girişinizin tek tek olması dışında gerçekten iyi çalışır. Yani...

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

... işe yarayabilir, ama belki çok karmaşıktır ...


OP gereksinimini yanlış okuduktan sonra ilk başta aklıma da aynısı geldi, ama sedbunu yalnız yapmama izin verdim .
cuonglm

@cuonglm - yanlış okudum mu?
16:16

1
Hayır, bahse girerim. Ama sed 1d\;\$ddüzeltmeniz gerekiyor.
cuonglm

Bu varyant nasıl? sed '2~2p' infile | paste -d- - -
steeldriver

1
Şimdi anladım. paste -d- <(head -n -1 input) <(tail -n +2 input)
Costas

2

Bir tane daha sed

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

ve değiştirilebilir ( mikeserv sayesinde ):

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

1
y/-\n/\n-/ikisinin de yerini alabilir /// belki. Eğer olsaydı daha hızlı, \ n kullanımı için taşınabilir ve daha kısa olurdu.
mikeserv

1

Saf bir bash versiyonu -

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.