ファイル内の行を2つにグループ化する方法は?


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

しかし、最初のグループの最後の要素は、2番目のグループの最初の要素にはなりません。

回答:


9

awk

awk 'NR!=1{print x"-"$0}{x=$0}' file
  • NR!=1 最初の行を除くすべての行に適用されます
  • print x"-"$0 間にダッシュを付けて値を出力する
  • x=$0セットx(次の反復用)


5
paste -d- - ./infile <infile

^入力が1つずれる場合を除き、これは非常にうまく機能します。そう...

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

...動作しますが、複雑すぎる可能性があります...


まあ、それはOPの要件を誤って読んだ後に最初に思いついたのとまったく同じですが、私sedはそれを一人でやらせることにしました。
cuonglm

@cuonglm-私はそれを誤解しましたか?
mikeserv 2016年

1
いいえ、間違いない。しかし、それsed 1d\;\$dを修正する必要があります。
cuonglm

このバリアントはどうですか?sed '2~2p' infile | paste -d- - -
スチールドライバー2016年

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より速く、移植性があり、\ n短くなります。
mikeserv 2016年

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.