Я пытаюсь получить некоторую информацию из моего файла, используя 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:]]+$//"
удалить конечные пробелы.