2016-09-03 5 views
2

Я редактирую файл с помощью sed и сталкивался с проблемой, надеюсь, что sed-гуру должен быть в состоянии решить эту проблему.Редактирование неструктурированного файла с помощью sed

У меня есть неструктурированный/частично структурированный файл, который выглядит, как показано ниже

##INFO=<ID=EX_TARGET,Number=0,Type=Flag,Description="indicates whether a variant is within the exon pull down target boundaries"> 
##INFO=<ID=MULTI_ALLELIC,Number=0,Type=Flag,Description="indicates whether a site is multi-allelic"> 
##source_20160901.1=vcf-subset(r940) -f -c HG02291 /net/isilonP/public/rw/ensembl/1000genomes/release-17/tmp/slicer/1.1-1000000.ALL.chr1.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.vcf.gz 
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG02291 
1 10177 rs367896724 A AC 100 PASS AA=1 GT 1|0 
1 10235 rs540431307 T TA 100 PASS XX=5 GT 0|0 
1 10352 rs555500075 T TA 100 PASS JJ=7 GT 0|1 

Я вставил строку в файл с помощью следующей команды

sed 's/.*##source_.*/\#\#INFO=\<ID=P_ID\,Number=1\,Type=String\,Description=\"Person Identifier\"\>\n&/' infile > outfile

Выхода выглядит следующим образом

##INFO=<ID=EX_TARGET,Number=0,Type=Flag,Description="indicates whether a variant is within the exon pull down target boundaries"> 
##INFO=<ID=MULTI_ALLELIC,Number=0,Type=Flag,Description="indicates whether a site is multi-allelic"> 
##INFO=<ID=P_ID,Number=1,Type=String,Description="Patient Identifier"> 
##source_20160901.1=vcf-subset(r940) -f -c HG02291 /net/isilonP/public/rw/ensembl/1000genomes/release-17/tmp/slicer/1.1-1000000.ALL.chr1.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.vcf.gz 
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG02291 
1 10177 rs367896724 A AC 100 PASS AA=1 GT 1|0 
1 10235 rs540431307 T TA 100 PASS XX=5 GT 0|0 
1 10352 rs555500075 T TA 100 PASS JJ=7 GT 0|1 

Nex т, что я хочу сделать, это, возьмите вышеуказанный файл в качестве входных данных и добавьте ;P_ID=12345 в колонке 8, то есть AA=1, XX=5, JJ=7

Вывод должен выглядеть -

##INFO=<ID=EX_TARGET,Number=0,Type=Flag,Description="indicates whether a variant is within the exon pull down target boundaries"> 
##INFO=<ID=MULTI_ALLELIC,Number=0,Type=Flag,Description="indicates whether a site is multi-allelic"> 
##INFO=<ID=P_ID,Number=1,Type=String,Description="Patient Identifier"> 
##source_20160901.1=vcf-subset(r940) -f -c HG02291 /net/isilonP/public/rw/ensembl/1000genomes/release-17/tmp/slicer/1.1-1000000.ALL.chr1.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.vcf.gz 
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG02291 
1 10177 rs367896724 A AC 100 PASS AA=1;P_ID=12345 GT 1|0 
1 10235 rs540431307 T TA 100 PASS XX=5;P_ID=12345 GT 0|0 
1 10352 rs555500075 T TA 100 PASS JJ=7;P_ID=12345 GT 0|1 

До сих пор, у меня есть удалось выбрать столбец 8, но я не уверен, как добавить обновленные строки в файл после добавления информации.

Это, как я выбрать столбец 8 -

sed -re '{s/^(\S+\s+){7}(\S+).*$/\2/;p}'

Может ли один Pls помочь мне решить эту головоломку?

Заранее благодарен!

Prashant

+2

Посмотрите вариант GNU sed '-i'. – Cyrus

+0

Ни #, ни

+0

Спасибо, ред. Я очень новичок в этом, но я думаю, что sed/awk - очень мощные редакторы, и я хочу их изучить. В настоящее время я больше разбираюсь в таких параллельных технологиях, как Hadoop/Spark. Есть ли хорошие учебные ресурсы для awk + GNU Parallel? – PRP

ответ

1

sed для простых подстановок на отдельных линиях, то есть все. Для чего-нибудь еще вы должны использовать awk:

$ awk ' 
/^##source_/ { print "##INFO=<ID=P_ID,Number=1,Type=String,Description=\"Person Identifier\">" } 
!/^#/ { $8 = $8 ";P_ID=12345" } 
{ print } 
' file 
##INFO=<ID=EX_TARGET,Number=0,Type=Flag,Description="indicates whether a variant is within the exon pull down target boundaries"> 
##INFO=<ID=MULTI_ALLELIC,Number=0,Type=Flag,Description="indicates whether a site is multi-allelic"> 
##INFO=<ID=P_ID,Number=1,Type=String,Description="Person Identifier"> 
##source_20160901.1=vcf-subset(r940) -f -c HG02291 /net/isilonP/public/rw/ensembl/1000genomes/release-17/tmp/slicer/1.1-1000000.ALL.chr1.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.vcf.gz 
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG02291 
1 10177 rs367896724 A AC 100 PASS AA=1;P_ID=12345 GT 1|0 
1 10235 rs540431307 T TA 100 PASS XX=5;P_ID=12345 GT 0|0 
1 10352 rs555500075 T TA 100 PASS JJ=7;P_ID=12345 GT 0|1 
2
sed -re '{s/^((\S+ +){7}\S+)/\1;P_ID=12345/}' /tmp/so5.txt 

где /tmp/so5.txt является входной файл.

+0

Блестящий, это работает для моего примера. Но я сделал пример для простоты. Фактический 8-й столбец имеет случайный текст без шаблона, например 'AA =. |||; AC = 0; AF = 0,000199681; AFR_AF = 0,0008; AMR_AF = 0; AN = 2; DP = 9632; EAS_AF = 0; EUR_AF = 0 NS = 2504; SAS_AF = 0; VT = SNP' – PRP

+0

В принципе, мне нужно добавить '; P_ID = 12345' в конце каждого оператора в столбце 8. – PRP

+0

@PRP: регулярное выражение в ответе немного сложнее, чем тебе нужно; вы должны просто использовать: 'sed -re '{s/^ ((\ w + +) {7} \ w +)/\ 1; P_ID = 12345 /}'/tmp/so5.txt' (ищет 7 последовательностей слова символы плюс символы пробела, за которыми следуют больше символов слова (восьмой столбец), и замените все, что вы получили, плюс то, что вы хотели добавить. –

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