次のような別の文字列が続く名前のリストを並べ替えようとしています。
John Doe
AVAIL
Sara Doe
CALL
Jim Doe
AVAIL
これらを名前で並べ替えようとしていますが、並べ替えで理解できないようです。誰かがガイダンスを提供できますか?
私の最終的な出力は次のようになります。
Jim Doe
AVAIL
John Doe
AVAIL
Sara Doe
CALL
とても有難い!
最適にはほど遠いかもしれませんが、
sed -r ':r;/(^|\n)$/!{$!{N;br}};s/\n/\v/g' names | sort | sed 's/\v/\n/g'
仕事をしているようです(names
レコードのあるファイルです)。これにより、2 行だけでなく、任意の長さのレコードが可能になります。
直接ではありませんが、このような中間形式を使用できます。あなたの価値(CALL、AVAILなど)は限られていると思います。それ以外の場合は、より複雑なパターンを使用する必要がありますが、それは可能です。実際、bashでは何でもできます:-)
cat sorting | sed -n '1h; 1!H; ${ g; s/\nCALL\n/::CALL::/g; s/\nAVAIL\n/::AVAIL::/g ; s/\nAVAIL/::AVAIL::/g p }' | sort | sed "s/::/\n/g"
Jim Doe
AVAIL
John Doe
AVAIL
Sara Doe
CALL
それがうまくいくかどうかはわかりませんが、いくつかの制限がありますが、必要なことを行うような行があります.
awk '{if ((NR%2-1)==0) {line=sprintf("%-30s",$0)} else {print line ":" $0}}' | \
sort --key=1,30 | tr ':' '\n'
前提: レコード間に空白行はなく、名前は常に 30 文字未満で:
、テキストには使用されていません。
仮定が異なる場合、それを変更する方法を理解できると確信しています。
簡単に言えば、区切り文字として「:」を使用して 2 行をマージし、最初の行を 30 文字に埋め込み、最初の 30 文字を使用して並べ替えます。次に、改行します。