列 - 列 - 线关联/操作的困难

时间:2014-01-29 06:03:33

标签: python bash

哦,伟大且知识渊博的stackoverflow大师,

我正在尝试为我的数据处理算法找到合适的编码解决方案而且我被卡住了。我有2个文件(file1和file2),其中有4列,格式如下:

0.23961 216185 518 LIRRTSI
0.156348 216185 338 NTGSPYE
0.0999144 216185 216 PLLTKLK
0.0749358 216185 162 STHIPSH
0.0624465 216185 135 MRQRRNR
0.0531952 216185 115 TQLPNIR
0.0518075 216185 112 SQQILNR

我想在file1第4列字符串中搜索file1中包含匹配列4字符串的行。然后,我想将每个文件的匹配列4字符串和关联行的第1列字符串输出到新文件中。例如:

文件1:

0.23961 216185 518 LIRRTSI
0.156348 216185 338 NTGSPYE
0.0999144 216185 216 PLLTKLK

file2的:

0.3333333 300000 1000 MRQRRNR
0.2000000 300000 600 LIRRTSI
0.0450000 300000 135 TQLPNIR

理想情况下,我的file3输出如下:

0.23961 LIRRTSI 0.2000000

0.23961 216185 518 LIRRTSI 0.2000000 300000 600 LIRRTSI

最重要的是至少要将匹配的字符串和column1值输出到新文件。我还通过bash comm生成了第4列字符串列表,它们在文件1和文件2之间很常见。也许这是一个很好的起点?关于我如何在bash或python中使用它的任何想法。如果解决方案出现,我也愿意尝试任何语言。

谦虚地,

J.M。

3 个答案:

答案 0 :(得分:1)

您可以使用join

join -j4 -o 1.1 1.4 2.1 <(sort -k4 file1) <(sort -k4 file2)
  • -j4
    加入第4栏上的两个文件

  • -o 1.1 1.4 2.1
    输出第1列,第1列,第4列,第2列,文件2

答案 1 :(得分:0)

一个python解决方案:

f1 = {}
for line in open('file1'):
    f1[ line.split()[3] ] = line.strip()

for line in open('file2'):
    other = f1.get(line.split()[3], None)
    if other is not None:
        print '%s %s' % (other, line.strip())

运行您的两个文件,这会产生:

0.23961 216185 518 LIRRTSI 0.2000000 300000 600 LIRRTSI

上面首先介绍file1并创建一个名为f1的字典,该字典的第4列为其键。作为字典中一个条目的示例:f1['NTGSPYE'] = '0.156348 216185 338 NTGSPYE'

接下来,它一次遍历file2一行,查找第4列与字典f1中的键匹配的任何行。如果匹配,则从两个文件中打印相应的行。

请注意,文件中的数据由空格分隔。因此,对于其中一个文件的lineline.split()是四个值的列表。因为python从零开始计数,所以第四列在line.split()[3]

更多信息:直接将上述内容翻译为bash(v4或更高版本):

declare -A f1
while read -r one two three four
do
    f1["$four"]="$one"
done <file1

while read -r one two three four
do
    [ "${f1[$four]}" ] && echo "${f1[$four]} $four $one"
done <file2

答案 2 :(得分:0)

使用awk

1)输出格式:0.23961 LIRRTSI 0.2000000

awk 'FNR==NR{a[$4]=$1;next}$4 in a {print $1, $4, a[$4]}' file2 file1

2)输出格式:0.23961 216185 518 LIRRTSI 0.2000000 300000 600 LIRRTSI

awk 'FNR==NR{a[$4]=$0;next}$4 in a {print $0,a[$4]}' file2 file1

添加加入命令:

join -j4 -o 1.1 1.2 1.3 1.4 2.1 2.2 2.3 2.4 <(sort -k4 file1) <(sort -k4 file2)

0.23961 216185 518 LIRRTSI 0.2000000 300000 600 LIRRTSI