2016-09-03 15 views
2

sedを使用してファイルを編集していて、問題を見つけました。うまくいけば、sedの達人がこれを解決できるはずです。sedで構造化されていないファイルを編集する

私は、出力は次のようになり、次のコマンド

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"> 
##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 

以下のようになります。非構造化/部分的に構造化されたファイルを、持っています

##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私は、これまでのところ

##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 

- 私がやりたいトンの事はJJ=7

出力がどのように見えるべきで、入力として上記のファイルを取り、AA=1である列8、XX=5;P_ID=12345を追加し、あります列8を選択することができましたが、情報を追加した後に更新された行をファイルに戻す方法がわかりません。

これは私が列8を選択しています方法です -

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

をいずれかplsは私はこのパズルを解決するのに役立つだろうか?

ありがとうございます! /tmp/so5.txtがあなたの入力ファイルです

のPrashant

+2

GNU sedのオプション '-i'を見てください。 – Cyrus

+0

#sも

+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 

+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

基本的に、列8の各ステートメントの最後に '; P_ID = 12345'を追加する必要があります。 – PRP

+0

@PRP:答えの正規表現は、あなたが必要です。 'sed -re '{(s)}(7)\ w +)/ \ 1; P_ID = 12345 /}'/tmp/so5.txt'文字と空白文字のあとにさらに多くの単語文字(第8列)を追加し、追加したものと追加したいものをすべて置き換えます。 –

関連する問題