最近私は一人に尋ねた。質問行ペアをソートする方法の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