连接多个文件的好方法是什么,但删除标题行(事先未知的标题行数),并将第一个文件标题行保留为新连接文件中的标题?
我想在python中执行此操作,但只要我可以使用subprocess调用unix命令,awk或其他语言也可以工作。
注意:标题行都以#。
开头答案 0 :(得分:6)
我会这样做;
(cat file1; sed '/^#/d' file2 file3 file4) > newFile
答案 1 :(得分:4)
使用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
file2的:
#header file2
spam
eggs
file3的:
#header file3
python
file
<强>输出:强>
#header file1
foo
bar
spam
eggs
python
file
答案 2 :(得分:1)
试试这个:
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
答案 3 :(得分:1)
使用GNU awk
:
awk '
ARGIND == 1 { print; next }
/^[[:space:]]*#/ { next }
{ print }
' *.txt
答案 4 :(得分:1)
您可以调用将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()
答案 5 :(得分:1)
我可能会这样做:
#!/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
)。
答案 6 :(得分:0)
另一个awk
版本:
awk '!flag && /#/ { print; flag=1; next } flag && /#/ { next } 1' f1 f2 f3