Как извлечь первые два столбца, а затем удалить частичную информацию во втором столбце?

Я пытаюсь получить некоторую информацию из моего файла, используя awk и sed, но не знаю, как заставить это работать.

Вот мои данные выглядят так:

00020dfa-549d-43e4-877d-d3dcbc212fe5    Pleosporales_sp|HE820879|SH1523966.08FU|reps|k__Fungi;p__Ascomycota;c__Dothideomycetes;o__Pleosporales;f__unidentified;g__unidentified;s__Pleosporales_sp   90.099  707 1680    1195    39  24

И ожидаемый результат такой

00020dfa-549d-43e4-877d-d3dcbc212fe5    k__Fungi;   p__Ascomycota;  c__Dothideomycetes; o__Pleosporales;    f__unidentified;    g__unidentified;    s__Pleosporales_sp

В общем, я хочу получить данные только для первых двух столбцов, а во втором столбце мне нужна только информация, начинающаяся с k с табуляцией после всех «;».

Я попробовал код, как показано ниже:

awk -F"	" '{print $1, $2}' infile.tab |
    sed -e '|' -e '|' -e '|' -e '|' -e 'D' > outfile.tab

Но не смог получить ожидаемый результат. Буду признателен, если кто-нибудь может дать мне совет!

Всего 3 ответа


с awk

$ awk '{gsub(/.*|/,"",$2);   # remove everything upto the last pipe from $2
        gsub(/;/,";	",$2);   # add space after semicolon in $2
        print $1 "	" $2}' file

00020dfa-549d-43e4-877d-d3dcbc212fe5    k__Fungi;       p__Ascomycota;       c__Dothideomycetes;  
o__Pleosporales;        f__unidentified;     g__unidentified;        s__Pleosporales_sp

Возможно, более простой AWK, в остальном не очень отличается от решения @ karakfa:

 awk ' BEGIN { FS = OFS = "	" } { sub(/.*|/, "", $2) gsub(/;/, ";	", $2) print $1, $2 } ' infile.tab > outfile.tab 

Выход:

 00020dfa-549d-43e4-877d-d3dcbc212fe5 k__Fungi; p__Ascomycota; c__Dothideomycetes; o__Pleosporales; f__unidentified; g__unidentified; s__Pleosporales_sp 

Решение sed (если вы используете gnu sed вы можете заменить все $(printf ' ') просто на :

sed -E "s/([^[:blank:]]+[[:blank:]]+[^[:blank:]]+[[:blank:]]+).*/1/;s/[^[:blank:]]*|//;s/;/;$(printf '	')/g;s/[[:blank:]]+/$(printf '	')/;s/[[:blank:]]+$//" infile.tab > outfile.tab

Выход:

00020dfa-549d-43e4-877d-d3dcbc212fe5    k__Fungi;   p__Ascomycota;  c__Dothideomycetes; o__Pleosporales;    f__unidentified;    g__unidentified;    s__Pleosporales_sp

Пояснения:

  • s/([^[:blank:]]+[[:blank:]]+[^[:blank:]]+[[:blank:]]+).*/1/ будут сохранять только 2 поля
  • s/[^[:blank:]]*|// удалит все во 2-м поле, пока не достигнет k__Fungi
  • s/;/;$(printf ' ')/g; добавить вкладку после каждого ;
  • s/[[:blank:]]+/$(printf ' ')/ удалить все пробелы заменяются табуляцией, чтобы разделить первое и 2 поля (это можно опустить, если эти 2 поля уже разделены вкладкой
  • s/[[:blank:]]+$//" удалить конечные пробелы.

Есть идеи?

10000