奇数行に基づいてソートしてから重複値を削除するには?

奇数行に基づいてソートしてから重複値を削除するには?

次の種類のファイルがあります。

transcr_25793 +
YAL039C -
transcr_25793 +
YAL037C-B -
transcr_20649 +
YBL100C -
transcr_7135 +
YBL029C-A -
transcr_11317 +
YBL067C -
transcr_25793 +
YAL038W +
transcr_7135 +
YBL029W +

私は次のようなものを手に入れようとしています。

transcr_7135 +
YBL029C-A -
transcr_7135 +
YBL029W +
transcr_11317 +
YBL067C -
transcr_20649 +
YBL100C -
transcr_25793 +
YAL039C -
transcr_25793 +
YAL037C-B -
transcr_25793 +
YAL038W +

その後、後で次のようなものを探していました。

transcr_7135 +
YBL029C-A -
YBL029W +
transcr_11317 +
YBL067C -
transcr_20649 +
YBL100C -
transcr_25793 +
YAL039C -
YAL037C-B -
YAL038W +

sortマニュアルといくつかの記事を見てみましたが、それに適したものが見つからず、sort数値を使用して奇数行を取得します。

ベストアンサー1

純粋なgawkソリューション:

awk -F_ 'NR%2{i=$2;next}{a[i]=a[i]"\n"$0}
         END{PROCINFO["sorted_in"]="@ind_num_asc";
             for(i in a) printf "%s","transcr_"i""a[i]"\n"}' file

秘密は、aPROCINFO特殊配列のいくつかの助けを借りて、配列のインデックスを数値でソートすることです。gawk

transcr_7135
YBL029C-A -
YBL029W +
transcr_11317
YBL067C -
transcr_20649
YBL100C -
transcr_25793
YAL039C -
YAL037C-B -
YAL038W +

しかし残念ながら、awkは自然なソートオプションを提供していません。バージョンの並べ替え(数字を含むテキストベース)

おすすめ記事