Как извлечь первые два столбца, а затем удалить частичную информацию во втором столбце? - PullRequest
2 голосов
/ 14 мая 2019

Я пытаюсь получить некоторую информацию из моего файла, используя 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"\t" '{print $1, $2}' infile.tab |
    sed -e '|' -e '|' -e '|' -e '|' -e 'D' > outfile.tab

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

Ответы [ 3 ]

3 голосов
/ 15 мая 2019

с awk

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

00020dfa-549d-43e4-877d-d3dcbc212fe5    k__Fungi;       p__Ascomycota;       c__Dothideomycetes;  \
o__Pleosporales;        f__unidentified;     g__unidentified;        s__Pleosporales_sp
1 голос
/ 15 мая 2019

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

awk '
  BEGIN {
    FS = OFS = "\t"
  }
  {
    sub(/.*\|/, "", $2)
    gsub(/;/, ";\t", $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
0 голосов
/ 15 мая 2019

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

sed -E "s/([^[:blank:]]+[[:blank:]]+[^[:blank:]]+[[:blank:]]+).*/\1/;s/[^[:blank:]]*\|//;s/;/;$(printf '\t')/g;s/[[:blank:]]+/$(printf '\t')/;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:]]*\|// удалит все во второмполе до достижения k__Fungi
  • s/;/;$(printf '\t')/g; добавьте вкладку после каждого ;
  • s/[[:blank:]]+/$(printf '\t')/ удалить все пробелы заменить на вкладку, чтобы отделить первое и 2 поля (это может бытьне указывается, если эти 2 поля уже разделены вкладкой
  • s/[[:blank:]]+$//" удалить завершающие пробелы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...