2016-12-30 6 views
2

В файле, который имеет определенную информацию столбца, я хочу, чтобы удалить ровно 5 полей (т.е. :PG:PB:PI:PW:PC (разделитель «:») от конца линии, а не с самого началаКак использовать awk для выбора/удаления полей из конца столбца после разделения?

GT:AD:DP:GQ:PL:PG:PB:PI:PW:PC 
GT:AD:DP:GQ:PL:PG:PB:PI:PW:PC 
GT:AD:DP:GQ:PGT:PID:PL:PG:PB:PI:PW:PC 
GT:AD:DP:GQ:PGT:PID:PL:PG:PB:PI:PW:PC 

Предполагая. что приведенные выше данные от column #3 файла, я написал следующий код:

awk 'BEGIN{FS=OFS="\t"} { split($3, a,":")} {print ($1, $2, a[1]":"a[2]":"a[3]":"a[4]":"a[5])}' awk_test.vcf 

Этот код шпагат и выбирает первые 5 полей, но я хочу, чтобы удалить последние 5 полей S. выбор из первых полей не будет работать, поскольку некоторые поля, такие как PGT, PID, вставлены в определенные строки. Только, удаление с конца работает.

Ожидаемый результат:

GT:AD:DP:GQ:PL 
GT:AD:DP:GQ:PL 
GT:AD:DP:GQ:PGT:PID:PL 
GT:AD:DP:GQ:PGT:PID:PL 

Спасибо за помощь мне с кодом для первой части моего вопроса.

Но сценарий не работает для моего другого файла, который имеет следующие данные. Здесь я хочу обновить 9-й столбец с той же целью. Столбцы tab separated. Но то, что я хочу сделать, остается в основном тем же.

2 1463 . T TG 433.67 PASS AC=0;AF=0.00;AN=0;BaseQRankSum=-4.310e-01;ClippingRankSum=0.00;DP=247;ExcessHet=2.9800;FS=0.000;MQ=21.25;MQRankSum=0.00;QD=33.36;ReadPosRankSum=-6.740e-01;SOR=0.784;set=InDels GT:AD:DP:PL:PG:PB:PI:PW:PC ./.:76,0:76:0,0,0:./.:.:.:./.:. ./.:55,0:55:0,0,0:.:.:.:.:. ./.:68,0:68:0,0,0:.:.:.:.:. ./.:48,0:48:0,0,0:.:.:.:.:. 
2 1466 . TG T 395.82 PASS AC=0;AF=0.00;AN=0;BaseQRankSum=1.01;ClippingRankSum=0.00;DP=287;ExcessHet=5.1188;FS=7.707;MQ=18.00;MQRankSum=0.00;QD=17.21;ReadPosRankSum=1.28;SOR=0.074;set=InDels GT:AD:DP:PL:PG:PB:PI:PW:PC ./.:95,0:95:0,0,0:./.:.:.:./.:. ./.:64,0:64:0,0,0:.:.:.:.:. ./.:75,0:75:0,0,0:.:.:.:.:. ./.:53,0:53:0,0,0:.:.:.:.:. 
2 1467 . G T 1334.42 PASS AC=0;AF=0.00;AN=0;BaseQRankSum=0.674;ClippingRankSum=0.00;DP=287;ExcessHet=4.8226;FS=1.328;MQ=23.36;MQRankSum=0.00;QD=28.65;ReadPosRankSum=-4.310e-01;SOR=0.566;set=SNPs GT:AD:DP:PL:PG:PB:PI:PW:PC ./.:95,0:95:0,0,0:./.:.:.:./.:. ./.:64,0:64:0,0,0:.:.:.:.:. ./.:75,0:75:0,0,0:.:.:.:.:. ./.:53,0:53:0,0,0:.:.:.:.:. 
2 1516 . C T 5902.93 PASS AC=2;AF=0.250;AN=8;BaseQRankSum=0.287;ClippingRankSum=0.00;DP=411;ExcessHet=0.5065;FS=1.489;InbreedingCoeff=0.3492;MQ=59.77;MQRankSum=0.00;QD=28.38;ReadPosRankSum=-7.100e-02;SOR=0.553;set=SNPs GT:AD:DP:GQ:PL:PG:PB:PI:PW:PC 0/0:122,0:122:99:0,120,1800:0/0:.:.:0/0:. 1/1:1,108:109:99:3935,286,0:.:.:.:.:. 0/0:102,0:102:99:0,120,1800:.:.:.:.:. 0/0:78,0:78:99:0,120,1800:.:.:.:.:. 
2 1584 . CT C 164.08 PASS AC=0;AF=0.00;AN=8;DP=717;ExcessHet=0.0812;FS=0.000;InbreedingCoeff=0.9386;MQ=60.00;QD=32.82;SOR=3.611;set=InDels GT:AD:DP:GQ:PL:PG:PB:PI:PW:PC 0/0:122,0:122:99:0,120,1800:0/0:.:.:0/0:. 0/0:172,0:172:99:0,120,1800:.:.:.:.:. 0/0:102,0:102:99:0,120,1800:.:.:.:.:. 0/0:321,0:321:99:0,120,1800:.:.:.:.:. 
2 1609 . C A 604.68 PASS AC=0;AF=0.00;AN=0;DP=386;ExcessHet=0.1158;FS=0.000;InbreedingCoeff=0.8938;MQ=12.32;QD=31.09;SOR=1.061;set=SNPs GT:AD:DP:PL:PG:PB:PI:PW:PC ./.:0,0:0:0,0,0:./.:.:.:./.:. ./.:0,0:0:0,0,0:.:.:.:.:. ./.:0,0:0:0,0,0:.:.:.:.:. ./.:386,0:386:0,0,0:.:.:.:.:. 
2 1612 . TGTGAGCTATTTCTTTTACATTTTTCTTTAGATTCTAGGTTAAATTGTGAAGCTGATTATCTTTTTTGTTTACAG T 1298.76 PASS AC=2;AF=1.00;AN=2;DP=3;ExcessHet=0.1047;FS=0.000;InbreedingCoeff=0.8896;MQ=60.02;QD=29.54;SOR=1.179;set=InDels GT:AD:DP:GQ:PL:PG:PB:PI:PW:PC ./.:0,0:0:.:0,0,0:./.:.:.:./.:. ./.:0,0:0:.:0,0,0:.:.:.:.:. ./.:0,0:0:.:0,0,0:.:.:.:.:. 1/1:0,3:3:99:1355,582,0:.:.:.:.:. 
2 1657 . T A,* 3118.91 PASS AC=0,2;AF=0.00,1.00;AN=2;BaseQRankSum=0.578;ClippingRankSum=0.00;DP=4;ExcessHet=1.9114;FS=3.474;InbreedingCoeff=0.0821;MQ=26.68;MQRankSum=0.841;QD=28.10;ReadPosRankSum=-5.960e-01;SOR=0.821;set=SNPs GT:AD:DP:GQ:PL:PG:PB:PI:PW:PC ./.:0,0,0:0:.:0,0,0,0,0,0:./.:.:.:./.:. ./.:1,0,0:1:.:0,0,0,0,0,0:.:.:.:.:. ./.:0,0,0:0:.:0,0,0,0,0,0:.:.:.:.:. 2/2:0,0,3:3:99:1355,1360,1393,582,615,0:.:.:.:.:. 
2 1738 . A G 4693.24 PASS AC=2;AF=0.250;AN=8;BaseQRankSum=0.00;ClippingRankSum=0.00;DP=1595;ExcessHet=0.0577;FS=0.621;InbreedingCoeff=0.6496;MQ=60.00;MQRankSum=0.00;QD=5.46;ReadPosRankSum=0.307;SOR=0.773;set=SNPs GT:AD:DP:GQ:PL:PG:PB:PI:PW:PC 0/1:389,92:481:99:1748,0,12243:0|1:.,.,.,.,.:935:|:0.5 0/0:318,0:318:99:0,120,1800:.:.:.:.:. 0/1:270,53:323:99:990,0,9096:.:.:.:.:. 0/0:473,0:473:99:0,120,1800:.:.:.:.:. 
2 2781 . T G 435.07 PASS AC=1;AF=0.125;AN=8;BaseQRankSum=0.624;ClippingRankSum=0.00;DP=2146;ExcessHet=3.4523;FS=8.450;InbreedingCoeff=-0.0856;MQ=60.06;MQRankSum=-4.630e-01;QD=1.27;ReadPosRankSum=-5.980e+00;SOR=1.436;set=SNPs GT:AD:DP:GQ:PGT:PID:PL:PG:PB:PI:PW:PC 0/0:620,0:620:99:.:.:0,120,1800:0/0:.:.:0/0:. 0/1:309,34:343:99:0|1:2781_T_G:469,0,12941:.:.:.:.:. 0/0:492,0:492:99:.:.:0,120,1800:.:.:.:.:. 0/0:691,0:691:99:.:.:0,120,1800:.:.:.:.:. 
2 2786 . C G 39.69 PASS AC=0;AF=0.00;AN=8;BaseQRankSum=0.881;ClippingRankSum=0.00;DP=2145;ExcessHet=4.3933;FS=0.000;InbreedingCoeff=-0.1367;MQ=52.41;MQRankSum=-1.356e+00;QD=1.13;ReadPosRankSum=0.577;SOR=0.527;set=SNPs GT:AD:DP:GQ:PL:PG:PB:PI:PW:PC 0/0:620,0:620:99:0,120,1800:0/0:.:.:0/0:. 0/0:342,0:342:99:0,120,1800:.:.:.:.:. 0/0:492,0:492:99:0,120,1800:.:.:.:.:. 0/0:691,0:691:99:0,120,1800:.:.:.:.:. 
2 2787 . T C 993.78 PASS AC=1;AF=0.125;AN=8;BaseQRankSum=-2.967e+00;ClippingRankSum=0.00;DP=2153;ExcessHet=3.8663;FS=4.941;InbreedingCoeff=-0.1076;MQ=60.06;MQRankSum=-5.100e-01;QD=2.84;ReadPosRankSum=-3.689e+00;SOR=0.875;set=SNPs GT:AD:DP:GQ:PGT:PID:PL:PG:PB:PI:PW:PC 0/0:620,0:620:99:.:.:0,120,1800:0/0:.:.:0/0:. 0/1:309,41:350:99:0|1:2781_T_G:1027,0,13619:.:.:.:.:. 0/0:492,0:492:99:.:.:0,120,1800:.:.:.:.:. 0/0:691,0:691:99:.:.:0,120,1800:.:.:.:.:. 
2 2792 . A G 745.21 PASS AC=1;AF=0.125;AN=8;BaseQRankSum=0.271;ClippingRankSum=0.00;DP=2176;ExcessHet=5.9256;FS=5.964;InbreedingCoeff=-0.2087;MQ=59.48;MQRankSum=-4.920e-01;QD=1.83;ReadPosRankSum=-3.100e-02;SOR=1.389;set=SNPs GT:AD:DP:GQ:PGT:PID:PL:PG:PB:PI:PW:PC 0/0:620,0:620:99:.:.:0,120,1800:0/0:.:.:0/0:. 0/1:332,41:373:99:0|1:2781_T_G:705,0,13295:.:.:.:.:. 0/0:492,0:492:99:.:.:0,120,1800:.:.:.:.:. 0/0:691,0:691:99:.:.:0,120,1800:.:.:.:.:. 

Я также попытался добавить FS/OFS параметры, но он не работает.

+0

Что это нужно делать с Python? Или sed? Или выберите? –

+0

Я просто добавил тег, чтобы он доходил до большего числа людей. Кроме того, это то, что я хочу передать в мой сценарий python. Итак, – everestial007

+1

Добавление не связанных тегов может привлечь больше людей; это может иметь противоположное влияние на то, сколько ответов вы получите. –

ответ

4

После разъяснения, что файл выглядит, вот мой обновленный ответ:

Вы можете просто использовать

awk 'BEGIN{FS=OFS="\t"} {$9 = gensub(/(:[^:]+){5}$/,"","1",$9)} 1' yourfile 
  • Здесь мы используем стандартное разделение поля awk, так как ваш файл разделен на вкладку.
  • Далее мы добавим замену регулярных выражений в $9, которая представляет собой строку, разделенную двоеточием, которую вы хотите изменить.
  • Регулярное выражение работает так же, как и в старом ответе, в котором у меня сложилось впечатление, что строка состоит только из строки, разделенной двоеточием.

Старый Ответ Так как вы написали «трубу к питону» в своем комментарии, может быть, вы открыты к SED решения?

sed -r "s/(:[^:]+){5}$//" yourfile 

Здесь мы заменим (s/...// заменить ... ни с чем), то ... средства:

  • от конца линии ($)
  • пять ({5})
  • вхождений толстой кишки (:)
  • затем следует (+)
  • не двоеточие ([^:])

И это опять-таки можно "перевести" на AWK:

awk -F: 'BEGIN{FS=OFS="\t"} {$0 = gensub(/(:[^:]+){5}$/,"","1")} 1' yourfile 
+0

Я думаю, что более подробная информация поможет: как читать и манипулировать только третьим столбцом, но печатать другие столбцы тоже без каких-либо изменений. – everestial007

+0

@ everestial007 Если вы хотите работать с определенными полями/столбцами, тогда awk является ** правильным ** инструментом. –

+1

@ everestial007 После редактирования вопроса: вы можете использовать эту команду awk: 'awk '{$ 9 = gensub (/ (: [^:] +) {5} $ /," "," 1 ", $ 9)} 1 'yourfile', чтобы внести изменения в поле '$ 9'. –

3

Может быть, не самое лучшее awk решение, но работает:

awk -F: '{printf($1); for (i=2;i<=NF-5;i++) printf(":%s",$i); printf("\n"); }' file.txt 
  • разделить поля естественно в соответствии с двоеточием
  • печать первого поля, а затем и другие поля минус 5 последних из них (с помощью NF: номер заданной переменной поля), с ведущим двоеточием.
  • распечатать линию, чтобы закончить линию.

EDIT: Я знал, что лучше было бы использовать awk. Как отметил Ларс, это способ проще и чище:

awk -F: '{s= $1; for(i = 2; i<= NF-5;i++) s= s FS $i; print s}' 
  • использовать значение разделителя вместо закодированного двоеточия
  • Compose строки вместо печати всех полей
  • строки печати в конце

Если вы хотите использовать его в скрипте python, я бы предложил вам написать это в python, проще & быстрее:

import csv 

with open("file.txt") as fr, open("out.txt","w",newline="") as fw: 
    cr = csv.reader(fr,delimiter=":") 
    cw = csv.writer(fw,delimiter=":") 
    for row in cr: 
     cw.writerow(row[:-5]) # write the row but the 5 last fields 

вы можете опустить часть with, если у вас уже есть открытые ручки.

РЕДАКТИРОВАТЬ: поскольку вы решительно отредактировали свой вопрос после моего ответа, теперь вы хотите удалить 5 последних «полей» из одного определенного поля (разделенное вкладками). Ларс ответил правильно awk -wise, позвольте мне предложить мой питон решение:

import csv 

with open("file.txt") as fr, open("out.txt","w",newline="") as fw: 
    cr = csv.reader(fr,delimiter="\t") 
    cw = csv.writer(fw,delimiter="\t") 
    for row in cr: 
     row[8]=":".join(row[8].split(":")[:-5]) # remove 5 last "fields" from 8th field 
     cw.writerow(row) # write the modified row 
+0

Используя печать и FS, вы можете немного упростить: 'awk -F: '{s = $ 1; для (i = 2; i <= NF-5; i ++) s = s FS $ i; print s} 'file' –

+0

@LarsFischer I НИКОГДА не удалось написать простой скрипт awk :) thx отредактировал (буду ли я когда-либо учиться у экспертов awk?) –

+0

На самом деле он не работает. Вывод выглядит так: «GT: PW: PC». Он удаляет поле из начала и конца столбцов. – everestial007

 Смежные вопросы

  • Нет связанных вопросов^_^