9

次のような別の文字列が続く名前のリストを並べ替えようとしています。

John Doe
AVAIL

Sara Doe
CALL

Jim Doe
AVAIL

これらを名前で並べ替えようとしていますが、並べ替えで理解できないようです。誰かがガイダンスを提供できますか?

私の最終的な出力は次のようになります。

Jim Doe
AVAIL

John Doe
AVAIL

Sara Doe
CALL

とても有難い!

4

3 に答える 3

9

最適にはほど遠いかもしれませんが、

sed -r ':r;/(^|\n)$/!{$!{N;br}};s/\n/\v/g' names | sort | sed 's/\v/\n/g'

仕事をしているようです(namesレコードのあるファイルです)。これにより、2 行だけでなく、任意の長さのレコードが可能になります。

于 2012-07-03T17:31:22.530 に答える
0

直接ではありませんが、このような中間形式を使用できます。あなたの価値(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
于 2012-07-03T17:39:41.533 に答える
0

それがうまくいくかどうかはわかりませんが、いくつかの制限がありますが、必要なことを行うような行があります.

awk '{if ((NR%2-1)==0) {line=sprintf("%-30s",$0)} else {print line ":" $0}}' | \
  sort --key=1,30 | tr ':' '\n'

前提: レコード間に空白行はなく、名前は常に 30 文字未満で:、テキストには使用されていません。

仮定が異なる場合、それを変更する方法を理解できると確信しています。

簡単に言えば、区切り文字として「:」を使用して 2 行をマージし、最初の行を 30 文字に埋め込み、最初の 30 文字を使用して並べ替えます。次に、改行します。

于 2012-07-03T17:33:34.027 に答える