jia*_*mao 6 unix awk header insert
我想听听你如何插入标题行(文件中的所有行)到另一个文件(更大,几GB)的说明.我更喜欢使用Unix/awk/sed方式完成这项工作.
# header I need to insert to another, they are in a file named "header".
##fileformat=VCFv4.0
##fileDate=20090805
##source=myImputationProgramV3.1
##reference=1000GenomesPilot-NCBI36
##phasing=partial
##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
##INFO=<ID=AF,Number=.,Type=Float,Description="Allele Frequency">
##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele">
##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129">
##INFO=<ID=H2,Number=0,Type=Flag,Description="HapMap2 membership">
##FILTER=<ID=q10,Description="Quality below 10">
##FILTER=<ID=s50,Description="Less than 50% of samples have data">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
##FORMAT=<ID=HQ,Number=2,Type=Integer,Description="Haplotype Quality">
#CHROM POS ID REF ALT QUAL FILTER INFO
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 12
header="/name/of/file/containing/header"
for file in "$@"
do
cat "$header" "$file" > /tmp/xx.$$
mv /tmp/xx.$$ "$file"
done
Run Code Online (Sandbox Code Playgroud)
您可能更喜欢将临时文件放在与您正在编辑的文件相同的文件系统上,但是任何需要在文件前面插入数据的内容最终都会非常接近于此.如果你每天都要这样做,那么你可能会把东西稍微装点一些,但是节省的几率可能是微不足道的(每个文件的分数为一秒).
如果你真的,真的必须使用sed,那么我想你可以使用:
header="/name/of/file/containing/header"
for file in "$@"
do
sed -e "0r $header" "$file" > /tmp/xx.$$
mv /tmp/xx.$$ "$file"
done
Run Code Online (Sandbox Code Playgroud)
该命令读取第0行之后(第1行之前)的标题内容,然后其他所有内容都保持不变.这并不像时候那么迅速cat.
使用的类似构造awk是:
header="/name/of/file/containing/header"
for file in "$@"
do
awk '{print}' "$header" "$file" > /tmp/xx.$$
mv /tmp/xx.$$ "$file"
done
Run Code Online (Sandbox Code Playgroud)
这只是打印输出上的每个输入行; 再次,不是那么快cat.
cat超过sed或的另一个优点awk; cat即使大文件主要是二进制数据(它不知道文件的内容)也会工作.二者sed并awk旨在处理分成行的数据; 虽然现代版本可能会很好地处理二进制数据,但它并不是它们的设计目标.