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行ごとに結合し、;最後の分割フィールドを各行の先頭にコピーし、最初のフィールドをソートしてから切り取り、行を再分割します。

答え2

わずかに変更するだけで、このソリューションを使用できます。出版しました他の質問について。

GNU sed と GNU awk を再利用し、最後の要素をソートキーとして使用して、データの同種構造を想定します。

# Separate input into records, here 3 lines each
sed '3~3G' infile |

# Use GNU awk's built-in sort, here index-string-descending
awk '
  BEGIN { PROCINFO["sorted_in"] = "@ind_str_desc" }
  { h[$NF] = $0 }
  END { for(k in h) print h[k] }
' RS= FS='[;\n]+'   

出力:

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

関連情報