使用不同行长度的文件水平合并制表符分隔文件

时间:2014-07-15 14:26:08

标签: python unix merge padding multiple-columns

我是一个完整的编程新手,所以我为任何缺乏清晰度,极端混乱等道歉。我想要做的是将大量文件合并到一个文件中。每个文件以制表符分隔,具有相同数量的列(13),但行数不同(~40000)。我希望最终产品包含

file1col1      file1col2   ...   file1col13    file2col1      file2col2   ...   file2col13    file3col1      ...         etc

(所有空格都是标签)

只要保留了所有列,就可以以任何方式填充文件的末尾。

我想要做的只是在unix中使用paste命令;但是,这并没有保留我的专栏。我尝试从一堆略有不同的问题中解析解决方案,但我担心我是一个初学者,我甚至不知道该怎么做。我更愿意使用unix或python来解决这个问题,但我愿意接受任何建议。

提前感谢您提供的任何帮助!

P.S。我使用大量文件(~40)这样做,所以如果输入可以使用相同扩展名的给定目录中的所有文件,那将是理想的。

编辑:paste -D$'\t' *.b > merge适用于文件的第一部分,输出

9       13577718        0       0       0       1       0       0       0       0       0       0       0       9       13576563        1       0       0       0       0       0       0       0       0       0       0       9       13577772        0       0       1       0       0       0  ...etc across

在文件的末尾(使用tail查看),一切都变得混乱和错位。我不确定如何最好地代表这一点,我没有发布图像的声誉。

1 个答案:

答案 0 :(得分:1)

假设您的文件名列表存储在名为filenames的数组中(我在命名变量时尽量不要想象)。如果在命令行上给出了名称,则可以将其创建为

filenames = sys.argv[1:]

你要问的一种方法如下。

output = open("yourfile.txt", "w")
files = []
for filename in filenames:
    files.append(open(filename, "r"))
num_files = len(files)
num_empty = 0
while True:
    num_empty = 0
    line = []
    for file in files:
        item = file.readline() # returns empty string after EOF
        if not item: 
            item = "None" # or other marker value
            num_empty += 1
        line.append(item)
    if num_empty == num_files:
        break
    output.write("\t".join([x.strip() for x in line]))
    output.write("\n")
for file in files:
    file.close()
output.close()

.strip()方法调用删除任何无关的空格,包括出现在Python读取的文本行末尾的新行作为标准。 .join()方法使用字符串列表的元素将它们与分隔标签连接起来。