什么是连接多个文件的好方法,但删除标题行(事先不知道标题行的数量),并将第一个文件标题行保留为新连接文件中的标题?
我想在 python 中执行此操作,但只要我可以使用 subprocess 调用 unix 命令,awk 或其他语言也可以。
注意:标题行均以 # 开头。
我会这样做;
(cat file1; sed '/^#/d' file2 file3 file4) > newFile
像这样使用 Python:
files = ["file1","file2","file3"]
with open("output_file","w") as outfile:
with open(files[0]) as f1:
for line in f1: #keep the header from file1
outfile.write(line)
for x in files[1:]:
with open(x) as f1:
for line in f1:
if not line.startswith("#"):
outfile.write(line)
您也可以在fileinput
此处使用该模块:
这个模块实现了一个帮助类和函数来快速编写一个循环标准输入或文件列表。
import fileinput
header_over = False
with open("out_file","w") as outfile:
for line in fileinput.input():
if line.startswith("#") and not header_over:
outfile.write(line)
elif not line.startswith("#"):
outfile.write(line)
header_over = True
用法 :$ python so.py file1 file2 file3
输入:
文件1:
#header file1
foo
bar
文件2:
#header file2
spam
eggs
文件3:
#header file3
python
file
输出:
#header file1
foo
bar
spam
eggs
python
file
尝试这个:
def combine(*files):
with open("result.txt","w+") as result:
for i in files:
with open(i,"r+") as f:
for line in f:
if not line.strip().startswith("#"):
result.write(line.rstrip())
combine("file1.txt","file2.txt")
file1.txt
:
#header2
body2
file2.txt
:
#header2
body2
result.txt
body2body
使用GNU awk
:
awk '
ARGIND == 1 { print; next }
/^[[:space:]]*#/ { next }
{ print }
' *.txt
你可以调用一个shell管道传递shell=True
给subprocess.Popen
cat f.1 ; grep -v -h '^#' f.2 f.3 f.4 f.5
快速示例
import sys, subprocess
p = subprocess.Popen('''cat f.1 ; grep -v -h '^#' f.2 f.3 f.4 f.5''', shell=True,
stdout=sys.stdout)
p.wait()
我可能会这样做:
#!/usr/bin/env python
import sys
for i in range(1, len(sys.argv)):
for line in open(sys.argv[i], "r"):
if i == 1 or not line.startswith("#"):
print line.rstrip('\n')
使用文件作为参数运行脚本并将输出重定向到结果文件:
$ ./combine.py foo.txt bar.txt baz.txt > result.txt
标头将取自参数列表的第一个文件(foo.txt
在上面的示例中)。
另一个awk
版本:
awk '!flag && /#/ { print; flag=1; next } flag && /#/ { next } 1' f1 f2 f3