awk разделить и изменить порядок

avatar
user977828
9 августа 2021 в 00:07
153
2
0

У меня есть следующие строки, разделенные табуляцией.

NIATv7_g10470.t1    XP_019227081.1  100.0   878 0   0   1   878 1   878 0.0e+00 1599.7  99.9    MELKVSSPKPVFSTSDCNSDPEEKEISEDXXXXXXXXXXXXXTRSQSTETEALEPALRRPFRKRNKPFENGHPYQEGDSHSSDTRFGKRRGMGSFSRTPSDSYQMMRLNQSLSGHAAPGRGRGRESGAWGPCESRFSTIDIASQFVPQGPINPLLYTGRGPQNVSSGQGASWNAFGIVPGIPNGGLDTLHTLGLQGRLRTSLNPAMSMGIPRQRCRDFEERGFCLRGDMCPLEHGVNRIVVEDVQSLSKFNLPVSLPGAHTLGPATAQGPLPAISPSSSLANKALHNKSINPPVIDNGLGLTDTFGGGSVSGGADFYDPDQPLWSNDHPENSAALLDVNRSKIDDTGPMLDADSSDQDQVALCDGFKLERLVRDAGAASGSQSVWERTSRSKHKLQSFNSTQGINRHGKQTNVDTIDPQMVESSSEPQSSSGRNMRKPSQKALRTLFVSGVPQKDNKPEALLSHFQKFGEVIDIYIPMNGERAFVQFSKREEAEAALKAPDAVMGNRFIKLFWANRDSIMDNGTSGSSIFPLAPRGGTPSTVPPHLLFPHKRKDNLQTVAGKTAEQACGSVTVAPLATSDLPKPVAQNGLKTTPPLKKKLETLELLKEEMRXXXXXXXXXXXXXXXXXXXXXKQAVGVKDEAAPDQAMNKPKGGGTVSNSGXXXXXXXXXXXXXXXXXXXXXXXXXSRSTENAEPTCSKLSLTVAMHEASNLKQSIRPLAPVGAPFILNRYKLDNRPTTFKILPPLPSALANVDVLKEHFSTFGDPPSVELEDLEPKDCNDGSEVQNTSARISFRSRRSAERAFLNGKSWQGQILQLMWVQSSNPAKDVGVGENVTPASKQPSDANGQSNARNGVAGLPEGSVAGNHEPDNQGRREDE  MELKVSSPKPVFSTSDCNSDPEEKEISEDXXXXXXXXXXXXXTRSQSTETEALEPALRRPFRKRNKPFENGHPYQEGDSHSSDTRFGKRRGMGSFSRTPSDSYQMMRLNQSLSGHAAPGRGRGRESGAWGPCESRFSTIDIASQFVPQGPINPLLYTGRGPQNVSSGQGASWNAFGIVPGIPNGGLDTLHTLGLQGRLRTSLNPAMSMGIPRQRCRDFEERGFCLRGDMCPLEHGVNRIVVEDVQSLSKFNLPVSLPGAHTLGPATAQGPLPAISPSSSLANKALHNKSINPPVIDNGLGLTDTFGGGSVSGGADFYDPDQPLWSNDHPENSAALLDVNRSKIDDTGPMLDADSSDQDQVALCDGFKLERLVRDAGAASGSQSVWERTSRSKHKLQSFNSTQGINRHGKQTNVDTIDPQMVESSSEPQSSSGRNMRKPSQKALRTLFVSGVPQKDNKPEALLSHFQKFGEVIDIYIPMNGERAFVQFSKREEAEAALKAPDAVMGNRFIKLFWANRDSIMDNGTSGSSIFPLAPRGGTPSTVPPHLLFPHKRKDNLQTVAGKTAEQACGSVTVAPLATSDLPKPVAQNGLKTTPPLKKKLETLELLKEEMRXXXXXXXXXXXXXXXXXXXXXKQAVGVKDEAAPDQAMNKPKGGGTVSNSGXXXXXXXXXXXXXXXXXXXXXXXXXSRSTENAEPTCSKLSLTVAMHEASNLKQSIRPLAPVGAPFILNRYKLDNRPTTFKILPPLPSALANVDVLKEHFSTFGDPPSVELEDLEPKDCNDGSEVQNTSARISFRSRRSAERAFLNGKSWQGQILQLMWVQSSNPAKDVGVGENVTPASKQPSDANGQSNARNGVAGLPEGSVAGNHEPDNQGRREDE  MELKVSSPKPVFSTSDCNSDPEEKEISEDXXXXXXXXXXXXXTRSQSTETEALEPALRRPFRKRNKPFENGHPYQEGDSHSSDTRFGKRRGMGSFSRTPSDSYQMMRLNQSLSGHAAPGRGRGRESGAWGPCESRFSTIDIASQFVPQGPINPLLYTGRGPQNVSSGQGASWNAFGIVPGIPNGGLDTLHTLGLQGRLRTSLNPAMSMGIPRQRCRDFEERGFCLRGDMCPLEHGVNRIVVEDVQSLSKFNLPVSLPGAHTLGPATAQGPLPAISPSSSLANKALHNKSINPPVIDNGLGLTDTFGGGSVSGGADFYDPDQPLWSNDHPENSAALLDVNRSKIDDTGPMLDADSSDQDQVALCDGFKLERLVRDAGAASGSQSVWERTSRSKHKLQSFNSTQGINRHGKQTNVDTIDPQMVESSSEPQSSSGRNMRKPSQKALRTLFVSGVPQKDNKPEALLSHFQKFGEVIDIYIPMNGERAFVQFSKREEAEAALKAPDAVMGNRFIKLFWANRDSIMDNGTSGSSIFPLAPRGGTPSTVPPHLLFPHKRKDNLQTVAGKTAEQACGSVTVAPLATSDLPKPVAQNGLKTTPPLKKKLETLELLKEEMRXXXXXXXXXXXXXXXXXXXXXKQAVGVKDEAAPDQAMNKPKGGGTVSNSGXXXXXXXXXXXXXXXXXXXXXXXXXSRSTENAEPTCSKLSLTVAMHEASNLKQSIRPLAPVGAPFILNRYKLDNRPTTFKILPPLPSALANVDVLKEHFSTFGDPPSVELEDLEPKDCNDGSEVQNTSARISFRSRRSAERAFLNGKSWQGQILQLMWVQSSNPAKDVGVGENVTPASKQPSDANGQSNARNGVAGLPEGSVAGNHEPDNQGRREDE* MELKVSSPKPVFSTSDCNSDPEEKEISEDDDDDRNHKHRRKDTRSQSTETEALEPALRRPFRKRNKPFENGHPYQEGDSHSSDTRFGKRRGMGSFSRTPSDSYQMMRLNQSLSGHAAPGRGRGRESGAWGPCESRFSTIDIASQFVPQGPINPLLYTGRGPQNVSSGQGASWNAFGIVPGIPNGGLDTLHTLGLQGRLRTSLNPAMSMGIPRQRCRDFEERGFCLRGDMCPLEHGVNRIVVEDVQSLSKFNLPVSLPGAHTLGPATAQGPLPAISPSSSLANKALHNKSINPPVIDNGLGLTDTFGGGSVSGGADFYDPDQPLWSNDHPENSAALLDVNRSKIDDTGPMLDADSSDQDQVALCDGFKLERLVRDAGAASGSQSVWERTSRSKHKLQSFNSTQGINRHGKQTNVDTIDPQMVESSSEPQSSSGRNMRKPSQKALRTLFVSGVPQKDNKPEALLSHFQKFGEVIDIYIPMNGERAFVQFSKREEAEAALKAPDAVMGNRFIKLFWANRDSIMDNGTSGSSIFPLAPRGGTPSTVPPHLLFPHKRKDNLQTVAGKTAEQACGSVTVAPLATSDLPKPVAQNGLKTTPPLKKKLETLELLKEEMRKKQEMLEQKRNEFRRKLDKLEKQAVGVKDEAAPDQAMNKPKGGGTVSNSGKVENSSPVEPSNTVSSPPSEATPDSSRSTENAEPTCSKLSLTVAMHEASNLKQSIRPLAPVGAPFILNRYKLDNRPTTFKILPPLPSALANVDVLKEHFSTFGDPPSVELEDLEPKDCNDGSEVQNTSARISFRSRRSAERAFLNGKSWQGQILQLMWVQSSNPAKDVGVGENVTPASKQPSDANGQSNARNGVAGLPEGSVAGNHEPDNQGRREDE  XP_019227081.1 PREDICTED: zinc finger CCCH domain-containing protein 41-like [Nicotiana attenuata]

Я использовал эту команду awk, чтобы упростить приведенную выше строку:

> awk 'BEGIN { FS = "\t" } ;{print $1","$18}' NIATT_r2.0.aa.combined_nr_XPonly.best_hit_addNoXP | head
NIATv7_g10470.t1,XP_019227081.1 PREDICTED: zinc finger CCCH domain-containing protein 41-like [Nicotiana attenuata]

Я хотел бы разделить $18 для первого вхождения пробела.

XP_019227081.1 PREDICTED: zinc finger CCCH domain-containing protein 41-like [Nicotiana attenuata]

Вывод этого разделения, который я хотел бы поменять местами и разделить табуляцией.

PREDICTED: zinc finger CCCH domain-containing protein 41-like [Nicotiana attenuata]   XP_019227081.1 

В качестве окончательного результата я хотел бы объединить $1 с обратным результатом разделения, чтобы получить следующий результат:

NIATv7_g10470.t1,PREDICTED: zinc finger CCCH domain-containing protein 41-like [Nicotiana attenuata]       XP_019227081.1 

Как это возможно?

Источник
David C. Rankin
9 августа 2021 в 00:15
0

Похоже, ваш исходный файл разделен комбинацией пробелов и табуляций. Просто оставьте FS по умолчанию (не устанавливайте его), и он будет разбиваться на пробелы, включая пробелы или табуляции. Например, по умолчанию $1 равно NIATv7_g10470.t1, а $18 равно XP_019227081.1 ($19 равно PREDICTED:).

user977828
9 августа 2021 в 01:32
0

Извините, я обновил входной файл в своем вопросе.

Mark Setchell
9 августа 2021 в 01:52
0

Не могли бы вы просто сказать на простом английском, что вы хотели бы, пожалуйста, чтобы мне не пришлось прокручивать вправо до Японии и запоминать 20 странных (для меня) полей. Спасибо.

HatLess
9 августа 2021 в 02:46
0

Что-то вроде этого, что вы просите? awk '{print $1","$19,$20,$21,$22,$23,$24,$25,$26,$NF"\t\t"$18}'

user977828
9 августа 2021 в 03:58
0

Извините, за путаницу. Я обновил свой вопрос.

Ответы (2)

avatar
Renaud Pacalet
9 августа 2021 в 06:28
1

Если вы используете GNU awk с расширением gensub, вы можете попробовать:

awk -F'\t' '{print $1 "," gensub(/(\S+)\s+(.*)/, "\\2\t\\1", "1", $18)}'
avatar
tripleee
9 августа 2021 в 06:38
0

Функция split позволяет разделить значение на произвольное регулярное выражение.

awk -F '\t' '{ split($18, fields, / /);
    print $1 "," substr($18, length(fields[1]) + 2) "\t" fields[1]  }' NIATT_r2.0.aa.combined_nr_XPonly.best_hit_addNoXP

В качестве альтернативы вы можете использовать sub() (или в поддерживаемых диалектах Awk, gsub()) для выполнения замены регулярного выражения непосредственно на значении.

user977828
9 августа 2021 в 08:08
0

Спасибо за ваше решение, но оно не меняет раскол.

tripleee
9 августа 2021 в 08:12
0

Упс, исправлено сейчас.