如何从1 txt文件获取值并附加到另一个文件?

时间:2016-03-21 04:00:08

标签: python linux csv

我有2个文本文件。 " A.TXT"包含

A 1 AB ... 1 5 -3 4.5 (contains 11 columns. So "4.5" is in the 11th column)
A 2 BC ... -2 3 8 9.2
A 3 WE ... 2 3 8 5.2
A 4 RT ...  23 2 24 4.1 
...
END

" B.txt"除了最后2列与" A.txt"的列不同外,它们是相似的。另一个区别是" B.txt"包含一些不在" A.txt"中的其他行。例如,第三行A 3 QEW ... 5 23 34 5位于" B.txt"但不是" A.txt"

A 1 AB ... 1 5 4 9
A 2 BC ... -2 3 1 0
A 3 QEW ... 5 23 34 5
A 4 WE ... 2 3 -7 56
A 5 RT ...  23 2 -5 14 
...
END

我想要做的是提取" A.txt"的每一行中最后一列的值。并将其附加到" B.txt"中的相应行。对于" B.txt"中的每一行那不在" A.txt"中,如果第3列元素以字母&#34开头,我想追加值1; Q" (例如,QEW),否则为值2。所以输出应该看起来像

A 1 AB ... 1 5 4 9 4.5
A 2 BC ... -2 3 1 0 9.2
A 3 QEW ... 5 23 34 5 1 
A 4 WE ... 2 3 -7 56 5.2
A 5 RT ...  23 2 -5 14 4.1
...
END

我尝试了下面的代码,但没有生成输出。我做错了吗?

def main():
        #enter python code.py A.txt B.txt in command line
        A = open(sys.argv[1])

        AAlist = []
        TE = []
        i=1
        for line in A:
            linestr = ' '.join(line.split())   
            if linestr[1]==i:
                AAlist.append(linestr[2])
                TE.append(linestr[10])
            i+=1

        BAlist = []
        i=0
        j=0
        with open(sys.argv[2]) as B, open('outputpy.txt', 'w') as out_file:
            for line in B:
                linestr = ' '.join(line.split())   
                if linestr[1]==j:
                    at = linestr[2]
                    BAlist.append(atm)
                    if at!=AAlist[i]:
                        if at[0]=='Q':
                            out_file.write(1)
                        else:
                            out_file.write(2)              

                    #print >> outfile
                    out_file.write(TE[i])
                    i+=1
                    j+=1
        print "finished"

有没有办法使用Linux命令进行我想要的操作?它比Python代码更容易吗?

编辑:我展示了输出应该是什么样的

1 个答案:

答案 0 :(得分:0)

如果我理解正确,以下awk脚本应该按照您的要求执行:

NR==FNR{
    arr[$3] = $11
    next
}
{
    if ($3 in arr){
        print($0, arr[$3])
    }else if ($3 == "^Q"){
        print($0, "2")
    }else{
        print($0, "1")
    }
}

使用

运行它
awk -f script.awk f1 f2

NR==FNR对于第一个文件为true,对于所有其他文件为false,因此在第一部分中我们仅填充在这种情况下称为arr的数组。它填充了第3个字段的键,并具有第11个字段的值。您可以将$3替换为例如$1$2$3如果第二个文件中的匹配是使用前三个字段完成的(另请参阅我的问题中的评论)。

对于第二个文件,如果可以在数组中找到密钥,我们会附加它。如果没有,我们检查第3个字段的第一个字母是Q。如果是这种情况,我们附加一个2.否则我们追加一个。