我想在序言中说我是一个初学者。
我有两个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
file1
。 awk
隐式循环遍历文件的每一行。
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/