sedを使用してn行を連結する

sedを使用してn行を連結する

最近私は一人に尋ねた。質問行ペアをソートする方法の1つは、次のsedように行を連結することを提案します。

cat file.txt | sed -n 'N;s/\n//;p' | sort -t";" -k43,43n | perl -F';' -ane '$,=";";print @F[0..13],"\n";print @F[14..$#F]'

これはうまくいきますが、私の問題はn-tuple行のソートで一般化されており、sedを使用してこれを行う方法がわかりません。

私が見つけたものはすべて2行またはすべての行ですが、n行が必要です(ここでnは現在5ですが、一般的なアプローチは問題ありません)。

n行を収容するためにそのセクションを書き換える良い方法のボーナスポイントですが、perl実際には問題はそのsedセクションに関するものです。

私はsedこれに特に焦点を当てていません。したがって、他のコマンドラインツールを使用して良い解決策がある場合は、投稿してください。

更新:入力例(n == 3)

a1;b1;c1; 
n1;m1;l1; 
d1;e1;f1;g1
n2;m2;l2;
a2;b2;c2;
d2;e2;f2;g2

ベストアンサー1

sed -e:n -e$\bo -e'N;s/\n/&/4;to' -ebn -e:o -e'y/\n/ /' <in >out

これにより、5行(または1 + 4行)が連結され、各改行文字が空白に置き換えられます。しかし:

paste -d\  - - - - - <in >out

...それも動作します。

あなたgの仕事は次のように働くことができます。

paste -d\  - - <input   |
sed 's/.*;\(.*\)/\1;&/' |
sort -t\; -k1,1         |
cut  -d\; -f2-          |
tr \  \\n

...これは入力ファイルにスペースを使用しませんが、かなり一般的なアプローチです。空白の2行ごとに結合し、;最後の分割フィールドを各行の先頭にコピーし、最初のフィールドをソートしてから切り取り、行を再分割します。

おすすめ記事