连接文件awk / linux

时间:2014-09-23 20:16:08

标签: linux awk concatenation

我在文件夹中有n个文件,这些文件以行开头,如下所示。

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

5 个答案:

答案 0 :(得分:2)

特别是awk:

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

你正在检查线路($ 0)是否与#(/ ^#/)字符串不匹配(!〜),如果是,则打印该线路。您获取输入文件并写入(&gt;)outputfile。

答案 1 :(得分:0)

你的问题没有明确规定,但我认为你只是在寻找:

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

其中FILE_LIST是输入文件列表(您可以使用*

答案 2 :(得分:0)

或者您可以像这样使用grep

grep -vh "^##" *

-v表示inverted,因此该命令意味着...查找所有文件中未开始##的所有行并且不打印文件名({{1} })。

或者,如果你想在开始时发出1个标题行,

-h

答案 3 :(得分: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

请注意,$ FILES可能是ls,而grep中的-v选项是不匹配标志。

答案 4 :(得分:0)

我相信你想要的是

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