2016-09-03 2 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 

이하 I 다음 명령

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 내가 가진, 지금까지

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

- 내가하고 싶은 t의 것은 JJ=7

출력은 같이해야 입력으로 위의 파일을 가지고 AA=1입니다 열 여덟, XX=5;P_ID=12345을 추가한다 열 8을 선택하도록 관리되었지만 정보를 추가 한 후 파일에 업데이트 된 줄을 다시 넣는 방법을 모르겠습니다.

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

중 하나가 PLS 날이 퍼즐을 해결하는 데 도움이 수 - 나는 열 여덟을 선택하고 어떻게

이 무엇입니까?

미리 감사드립니다.

Prashant /tmp/so5.txt이 입력 파일입니다

+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

Brilliant, 내 작품을 위해 작동합니다. 그러나 단순화 목적으로 예제를 만들었습니다. 실제 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/^ ((\ w ++) {7} \ w +)/\ 1; P_ID = 12345 /} '/ tmp/so5.txt' 문자와 공백 문자 다음에 더 많은 단어 문자 (8 번째 열)를 추가하고 추가 한 항목과 추가 한 항목을 모두 바꿉니다. –

관련 문제