python - 根据两列提取行数据

标签 python database bash awk

我想在序言中说我是一个初学者。

我有两个txt文件。两列 (i, j) 中有大约 1000 个值,指的是已 splinter 的成对粒子。第二个文件包含所有 4M 个粒子的列中的 XYZ 坐标,其中粒子标签(i 或 j)是行号。我需要从文件 1 中获取标签(i 和 j)并找到它们关联的 XYZ 坐标,以便获得具有以下格式的新文件:

输出: 习一子Xj Yj Zj

对于每对 splinter 的粒子。

我不确定使用它的最佳工具是什么。我对 awk 和 bash 以及 python 有一些经验,但我没有取得任何进展。

文件 1:

C6i C7j
2084974 2135208
380134 632561
416969 416972
86296 86300
2296040 2343415
493401 562376
444984 522708
405188 536773
84709 130065

文件 2:XYZ 分别是第 3、4 和 5 列。

ni    -0.139703912516E-01 -0.588106472470E-02 -0.246993537185E-01  0.240235100000E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
al    -0.137235866800E-01 -0.641882704213E-02 -0.251673100913E-01  0.534478800000E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
ni    -0.185856021576E-01 -0.152366221623E-01 -0.121702424186E-01  0.243473343750E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
ni    -0.189394000761E-01 -0.152668306704E-01 -0.124951222187E-01  0.247782468750E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
ni    -0.186657676593E-01 -0.149796823498E-01 -0.117824363740E-01  0.245485618750E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
ni    -0.183548072309E-01 -0.146581691495E-01 -0.119760428210E-01  0.262177487500E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
al    -0.179781075366E-01 -0.152651341795E-01 -0.118226752981E-01  0.476129550000E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
al    -0.184341198964E-01 -0.147587453602E-01 -0.127106194529E-01  0.509758600000E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
ni    -0.162533369485E-01 -0.349146188426E-01 -0.141615273706E-01  0.253299731250E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
ni    -0.163557464187E-01 -0.344963153936E-01 -0.143620570810E-01  0.239937831250E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
ni    -0.166373601765E-01 -0.351914412333E-01 -0.135853527002E-01  0.244891000000E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
al    -0.158054048322E-01 -0.352289094572E-01 -0.137329142337E-01  0.462249725000E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
ni    -0.405319274446E-01 -0.296567975721E-01 -0.243386549644E-01  0.254679675000E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
ni    -0.409494727711E-01 -0.296234747969E-01 -0.240603258346E-01  0.250886643750E-03  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00

最佳答案

使用awk:

awk 'FNR==NR {xyz[FNR]=$3" "$4" "$5;next;} {print xyz[$1],xyz[$2];}' file2 file

假设 file1 是:

C6i C7j
2   3
6   1

file2 与您的问题中的相同,那么:

$ awk 'FNR==NR {xyz[FNR]=$3" "$4" "$5;next;} {print xyz[$1],xyz[$2];}' file2 file1

-0.641882704213E-02 -0.251673100913E-01 0.534478800000E-03 -0.152366221623E-01 -0.121702424186E-01 0.243473343750E-03
-0.146581691495E-01 -0.119760428210E-01 0.262177487500E-03 -0.588106472470E-02 -0.246993537185E-01 0.240235100000E-03

它是如何工作的:

awk 命令按此顺序给出两个文件:file2 file1awk 隐式循环遍历文件的每一行。

  • FNR==NR {xyz[FNR]=$3""$4""$5;next;}

    FNR 是迄今为止从当前文件读取的行数,NR 是迄今为止从所有文件读取的总行数。因此,当FNR==NR时,这意味着我们正在读取命令行上列出的第一个文件。对于该文件,我们将第 3,4,5 列保存到按行号索引的数组 xyz 中。

    next 命令告诉 awk 跳过剩余的命令并跳转到下一行重新开始。

  • 打印 xyz[$1],xyz[$2]

    如果我们到达这里,我们正在处理第二个命名文件,file1。我们在数组 xyz 中查找该行命名的两个粒子的坐标并将其打印出来。

关于python - 根据两列提取行数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26394509/

相关文章:

php - 通过 PHP 在数据库中上传照片时遇到困难

linux - 使用 sed 删除文件中的行,但定义的多个模式除外

linux - 在 bash 脚本 (Linux) 中从 maven POM 读取属性

bash - 将stdout和stderr捕获到不同的变量中

python - Plotly:如何在子图中制作无界垂直线?

python - 使用 RegEx 查找无序单词

python - 同情代码生成 : force uniform signature

Python - 线程和 While True 循环

php - 查询数据库时出错-PHP,SQL和PHPMyAdmin

php - 在mysql上使用关系表选择时生成自定义数组