2

什么是连接多个文件的好方法,但删除标题行(事先不知道标题行的数量),并将第一个文件标题行保留为新连接文件中的标题?

我想在 python 中执行此操作,但只要我可以使用 subprocess 调用 unix 命令,awk 或其他语言也可以。

注意:标题行均以 # 开头。

4

7 回答 7

6

我会这样做;

(cat file1; sed '/^#/d' file2 file3 file4) > newFile
于 2013-05-18T17:04:28.250 回答
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

文件2:

#header file2
spam
eggs

文件3:

#header file3
python
file

输出:

#header file1
foo
bar

spam
eggs

python
file
于 2013-05-18T16:27:13.393 回答
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
于 2013-05-18T16:33:51.580 回答
1

使用GNU awk

awk '
    ARGIND == 1 { print; next } 
    /^[[:space:]]*#/ { next }
    { print }
' *.txt
于 2013-05-18T16:35:48.723 回答
1

你可以调用一个shell管道传递shell=Truesubprocess.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()
于 2013-05-18T16:43:50.300 回答
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在上面的示例中)。

于 2013-05-18T16:44:43.267 回答
0

另一个awk版本:

awk '!flag && /#/ { print; flag=1; next } flag && /#/ { next } 1' f1 f2 f3
于 2013-05-18T20:03:57.500 回答