连接几个文件删除标题行

时间:2013-05-18 16:17:42

标签: python unix awk

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

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

注意:标题行都以#。

开头

7 个答案:

答案 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

的shell管道
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