2014-09-23 53 views
0

我有一個文件夾中的文件開頭的行如下所示。連接文件awk/linux

##contig=<ID=chr38,length=23914537> 
##contig=<ID=chrX,length=123869142> 
##contig=<ID=chrMT,length=16727> 
##samtoolsVersion=0.1.19-44428cd 
#CHROM POS  ID  REF  ALT  QUAL FILTER INFO FORMAT P922_120 
chr1 412573 SNP74 A  C  2040.77 PASS AC=2;AC1=2;AF=1.00;AF1=1;AN=2;DB;DP=58; 
chr1 602567 BICF2G630707977 A  G  877.77 PASS AC=2;AC1=2;AF=1.00;AF1=1;AN=2;DB; 
chr1 604894 BICF2G630707978 A  G  2044.77 PASS AC=2;AC1=2;AF=1.00;AF1=1;AN=2;DB; 
chr1 693376 .  GCCCCC GCCCC 761.73 .  AC=2;AC1=2;AF=1.00;AF1=1; 

有n個這樣的文件。我想將所有文件連接成一個文件,這樣所有用#開始的行應該從所有文件中刪除,並且連接來自所有文件的其餘行只保留標題行。示例輸出如下所示:

#CHROM POS  ID  REF  ALT  QUAL FILTER INFO FORMAT P922_120 
chr1 412573 SNP74 A  C  2040.77 PASS AC=2;AC1=2;AF=1.00;AF1=1;AN=2;DB;DP=58; 
chr1 602567 BICF2G630707977 A  G  877.77 PASS AC=2;AC1=2;AF=1.00;AF1=1;AN=2;DB; 
chr1 604894 BICF2G630707978 A  G  2044.77 PASS AC=2;AC1=2;AF=1.00;AF1=1;AN=2;DB; 
chr1 693376 .  GCCCCC GCCCC 761.73 .  AC=2;AC1=2;AF=1.00;AF1=1; 
+0

感謝大家。但是,標題行「#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT P922_120」只能作爲標題保留一次。 – chas 2014-09-23 20:54:15

回答

2
使用awk

具體做法是:

awk '$0!~/^#/{print $0}' file1 file2 file3 > outputfile 

分佈看你判斷行($ 0)不匹配(!〜)以#(/ ^#/)開頭的字符串,如果是,則打印該行。輸入文件並寫入(>)輸出文件。

+0

咦?當然,這將刪除以'#'開頭的標題。 – 2014-09-23 20:49:32

+0

謝謝。如果有n個文件,則會有n個標題行。並且您的解決方案完全刪除所有文件的標題。它應該保留一次,如輸出中所示。 – chas 2014-09-23 20:57:31

+0

如果你只需要頭一次,手動把它放在其中可能是更容易的選項,或者嘗試:'awk'BEGIN {f =「」}; $ 0〜/#C/&& f!=「T」{print $ 0 ; f =「T」}; $ 0!〜/ ^#/ {print $ 0}'file1 file2> outfile' – 2014-09-23 20:59:43

0

您的問題是不是非常明確的規定,但我認爲你只是在尋找:

sed '/^##/d' $FILE_LIST > output 

哪裏FILE_LIST輸入文件的列表(你可以使用*

+0

謝謝!!仍然是小問題。它打印所有以「#」開頭的行,即所有文件中的#CHROM標題行。它只能打印一次。我們能修復這個嗎? – chas 2014-09-23 20:49:32

0

或者您可以使用grep這樣的:

grep -vh "^##" * 

-v意味着inverted,所以該命令的含義是...查找所有文件中未開始##的所有行,並且不打印文件名(-h)。

或者,如果你想發出在開始1個標題行,

(grep -m1 ^#CHROM * ; grep -hv ^## *) > out.txt 
0

如果我理解正確的話,你可以這樣做:

echo "#CHROM POS  ID  REF  ALT  QUAL FILTER INFO FORMAT P922_120" > mergedfile 
for file in $FILES; do cat $file | grep -v "#" >> mergedfile; done 

注意$文件可以是ls和grep的-v選項是不匹配的標誌。

0

我相信你想要的是

awk '$0 ~/^##/ { next; } $0 ~ /^#/ && !printed_header {print; printed_header=1 } $0! ~ /^#/ {print }' file1 file2 file3