如何按奇數行排序然後刪除重複值?

如何按奇數行排序然後刪除重複值?

我有以下類型的文件:

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

訣竅是藉助PROCINFO 特殊數組a的一點幫助,對數組的索引進行數字排序。gawk

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

順便說一句,遺憾的是 awk 不提供自然排序的選項版本排序(根據帶有數字的文字)。

答案2

不完全是您所顯示的排序順序,但也許也是對的?

$ cat input.txt|paste - -| sort -k1,1V -k2,2| tr "\t" "\n" | awk '{if($0 in line == 0) {line[$0]; print}}'
    transcr_7135 +
    YBL029C-A -
    YBL029W +
    transcr_11317 +
    YBL067C -
    transcr_20649 +
    YBL100C -
    transcr_25793 +
    YAL037C-B -
    YAL038W +
    YAL039C -

編輯:

插入行號並將其用作排序鍵,應該會產生您喜歡的確切輸出:

$ cat input.txt | paste - - | nl | sort -k2,2V -k1,1g | cut -f2- | tr "\t" "\n" | awk '{if($0 in line == 0) {line[$0]; print}}'

答案3

使用 GNUsort並假設這些行不包含 TAB 字元:

paste - - < file | sort -V | tr '\t' '\n' | awk '!seen[$0]++'

sort -t$'\t' -sk1,1V保留具有相同奇數行的條目的原始順序,就像您的預期輸出一樣。

如果您沒有 GNU sort,並且假設奇數行始終遵循該模式,則可以替換sort -Vsort -k1.9n.

答案4

預處理和後處理awk:這並不假設transcr一行後面只有一行Y*;它也是冪等的——它的輸出可以作為輸入返回,並且會給出相同的結果。

awk '{print $0~/^transcr/ ? t=$0 : t" "$0}' /tmp/foo | sort -t_ -k2n -k2 -u | awk '{print (NF > 2) ? $3" "$4 : $0}'
transcr_7135 +
YBL029C-A -
YBL029W +
transcr_11317 +
YBL067C -
transcr_20649 +
YBL100C -
transcr_25793 +
YAL037C-B -
YAL038W +
YAL039C -

相關內容