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

  • 本文关键字:操作 -列 -行 关联 python bash
  • 更新时间 :
  • 英文 :


伟大而知识渊博的 stackoverflow大师

我正试图为我的数据处理算法找到一个合适的编码解决方案,但我被卡住了。我有两个文件(文件1和文件2),有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

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

文件1:

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

文件2:

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值输出到一个新文件中。我还通过bashcomm生成了一个列4字符串的列表,这些字符串在文件1和文件2之间很常见。也许这是一个好的起点?关于如何在bash或python中实现这一点的任何想法。如果有解决方案,我也愿意尝试任何语言。

谦虚地说,

J。M.

您可以使用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的第四列和文件2的第一列

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

使用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.23961216185518LIRRTSI0.2000000300000 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

相关内容

  • 没有找到相关文章

最新更新