处理通过文件交换的数据 BASH
Processing data swapped over files BASH
首先,对于我极其的编码基础知识,我深表歉意。然后我希望我能够正确地表达我自己的问题。不要犹豫,要求进一步的澄清或其他...
我在后处理数据时遇到问题...
我的目标是重新组合交换的数据。
编辑:这是一个 .rar 文件夹,其中包含我的测试示例和我尝试使其工作的示例...(当它需要处理数据时不要害怕)
https://drive.google.com/file/d/1AEPUc8haT5_Z3LR3jnZZlpyfxhdDwwo6/view?usp=sharing
编辑 2:这是我在纸上所期望的(它是我的 rar 存档中的 TestReorder3OK 文件夹)
enter image description here
编辑 3:最小的完整示例
脚本:
#!/bin/bash
# Definir le nombre de replica
NP=3
NP1=$[NP-1]
rm torder*
for repl in `seq 0 $NP1`
do
echo $repl
# colle la colonne 2 du fichier .lammps dans un fichier rep_0, puis dans la seconde boucle, la colonne 3 dans rep_1, etc.
awk -v rep=$repl '{r2=rep+2;print $r2}' < log.lammps > rep_$repl
i=0
j=0
# cree une boucle dans la boucle
for a in `cat rep_$repl`
do
i=$[i+1]
j=$[j+3]
head -$i screen.$repl.temp | tail -1 >> torder.$a
head -$j ccccd2_H_${repl}_col.bak2 | tail -3 >> ccccd2_H_${a}_temp_col.bak2
done
done
log.lammps 文件
1 0 1 2
2 1 0 2
3 1 2 0
从第 2 列开始,此文件包含与以下输入关联的数字。这是一个扩展的解释:
第 2 列具有三个值:0、1 和 1; 0 与文件的前三行相关联 ccccd2_H_0_col.bak2
,接下来的三行与 1 相关联,最后三行再次与值 1 相关联。
第 3 列也有三个值:1、0 和 2; 1 与文件的前三行相关联 ccccd2_H_1_col.bak2
,接下来的三行与 0 相关联,最后三行再次与值 2.
相关联
第 4 栏的内容相同。
现在我想要的是,与 0 值关联的每组三行都放入一个文件中。与值 1 相关联的每组三行进入另一个文件,与值 2 相关联的三行组进入最后一个文件。
输入:
ccccd2_H_0_col.bak2
blank line
N a b c
C d e f
N g h i
C j k l
N m n o
C p q r
ccccd2_H_1_col.bak2
blank line
N s t u
C v w x
N y z a
C b c d
N e f g
C h i j
ccccd2_H_2_col.bak2
blank line
N k l m
C n o p
N q r s
C t u v
N w x y
C z a b
输出: 这些是所需的输出,也是我为简单测试文件得到的输出
ccccd2_H_0_temp_col
blank line
N a b c
C d e f
N y z a
C b c d
N w x y
C z a b
ccccd2_H_1_temp_col
blank line
N g h i
C j k l
N m n o
C p q r
N s t u
C v w x
ccccd2_H_2_temp_col
blank line
N e f g
C h i j
N k l m
C n o p
N q r s
C t u v
这适用于小型测试文件(如此处所示),但不适用于我的真实系统。对于我的真实系统,我有包含 14 行和 10,001 行的 log.lammps
文件,以及包含 121,121 行的输入文件(因此 10,001 * 121 行的块)。它创建的文件比应有的数据大 10 倍。
你能解释一下我的问题吗?我认为这是 linked 到我的包含单行的文件和包含笛卡尔坐标的文件的行号差异,但我真的不明白 link 也不知道解决它的方法。 ..
提前致谢...
我想我明白你现在想做什么,这个 GNU awk 脚本(用于 ARGIND、ENDFILE 和内置的打开文件管理)可以做到:
$ cat ../tst.awk
ARGIND == 1 {
for (inFileNr=2; inFileNr<=NF; inFileNr++) {
outFileNrs[inFileNr,NR] = $inFileNr
}
next
}
ENDFILE { RS = "" }
{ print ORS [=10=] > ("ccccd2_H_" outFileNrs[ARGIND,FNR] "_temp_col") }
看:
输入:
$ ls
ccccd2_H_0_col.bak2 ccccd2_H_1_col.bak2 ccccd2_H_2_col.bak2 log.lammps
$ cat log.lammps
1 0 1 2
2 1 0 2
3 1 2 0
$ paste ccccd2_H_0_col.bak2 ccccd2_H_1_col.bak2 ccccd2_H_2_col.bak2 | sed 's/\t/\t\t/g'
N a b c N s t u N k l m
C d e f C v w x C n o p
N g h i N y z a N q r s
C j k l C b c d C t u v
N m n o N e f g N w x y
C p q r C h i j C z a b
脚本执行:
$ awk -f ../tst.awk log.lammps ccccd2_H_0_col.bak2 ccccd2_H_1_col.bak2 ccccd2_H_2_col.bak2
输出:
$ ls
ccccd2_H_0_col.bak2 ccccd2_H_1_col.bak2 ccccd2_H_2_col.bak2 log.lammps
ccccd2_H_0_temp_col ccccd2_H_1_temp_col ccccd2_H_2_temp_col
$ paste ccccd2_H_0_temp_col ccccd2_H_1_temp_col ccccd2_H_2_temp_col | sed 's/\t/\t\t/g'
N a b c N g h i N e f g
C d e f C j k l C h i j
N y z a N m n o N k l m
C b c d C p q r C n o p
N w x y N s t u N q r s
C z a b C v w x C t u v
首先,对于我极其的编码基础知识,我深表歉意。然后我希望我能够正确地表达我自己的问题。不要犹豫,要求进一步的澄清或其他...
我在后处理数据时遇到问题...
我的目标是重新组合交换的数据。
编辑:这是一个 .rar 文件夹,其中包含我的测试示例和我尝试使其工作的示例...(当它需要处理数据时不要害怕)
https://drive.google.com/file/d/1AEPUc8haT5_Z3LR3jnZZlpyfxhdDwwo6/view?usp=sharing
编辑 2:这是我在纸上所期望的(它是我的 rar 存档中的 TestReorder3OK 文件夹)
enter image description here
编辑 3:最小的完整示例
脚本:
#!/bin/bash
# Definir le nombre de replica
NP=3
NP1=$[NP-1]
rm torder*
for repl in `seq 0 $NP1`
do
echo $repl
# colle la colonne 2 du fichier .lammps dans un fichier rep_0, puis dans la seconde boucle, la colonne 3 dans rep_1, etc.
awk -v rep=$repl '{r2=rep+2;print $r2}' < log.lammps > rep_$repl
i=0
j=0
# cree une boucle dans la boucle
for a in `cat rep_$repl`
do
i=$[i+1]
j=$[j+3]
head -$i screen.$repl.temp | tail -1 >> torder.$a
head -$j ccccd2_H_${repl}_col.bak2 | tail -3 >> ccccd2_H_${a}_temp_col.bak2
done
done
log.lammps 文件
1 0 1 2
2 1 0 2
3 1 2 0
从第 2 列开始,此文件包含与以下输入关联的数字。这是一个扩展的解释:
第 2 列具有三个值:0、1 和 1; 0 与文件的前三行相关联 ccccd2_H_0_col.bak2
,接下来的三行与 1 相关联,最后三行再次与值 1 相关联。
第 3 列也有三个值:1、0 和 2; 1 与文件的前三行相关联 ccccd2_H_1_col.bak2
,接下来的三行与 0 相关联,最后三行再次与值 2.
第 4 栏的内容相同。
现在我想要的是,与 0 值关联的每组三行都放入一个文件中。与值 1 相关联的每组三行进入另一个文件,与值 2 相关联的三行组进入最后一个文件。
输入:
ccccd2_H_0_col.bak2
blank line
N a b c
C d e f
N g h i
C j k l
N m n o
C p q r
ccccd2_H_1_col.bak2
blank line
N s t u
C v w x
N y z a
C b c d
N e f g
C h i j
ccccd2_H_2_col.bak2
blank line
N k l m
C n o p
N q r s
C t u v
N w x y
C z a b
输出: 这些是所需的输出,也是我为简单测试文件得到的输出
ccccd2_H_0_temp_col
blank line
N a b c
C d e f
N y z a
C b c d
N w x y
C z a b
ccccd2_H_1_temp_col
blank line
N g h i
C j k l
N m n o
C p q r
N s t u
C v w x
ccccd2_H_2_temp_col
blank line
N e f g
C h i j
N k l m
C n o p
N q r s
C t u v
这适用于小型测试文件(如此处所示),但不适用于我的真实系统。对于我的真实系统,我有包含 14 行和 10,001 行的 log.lammps
文件,以及包含 121,121 行的输入文件(因此 10,001 * 121 行的块)。它创建的文件比应有的数据大 10 倍。
你能解释一下我的问题吗?我认为这是 linked 到我的包含单行的文件和包含笛卡尔坐标的文件的行号差异,但我真的不明白 link 也不知道解决它的方法。 ..
提前致谢...
我想我明白你现在想做什么,这个 GNU awk 脚本(用于 ARGIND、ENDFILE 和内置的打开文件管理)可以做到:
$ cat ../tst.awk
ARGIND == 1 {
for (inFileNr=2; inFileNr<=NF; inFileNr++) {
outFileNrs[inFileNr,NR] = $inFileNr
}
next
}
ENDFILE { RS = "" }
{ print ORS [=10=] > ("ccccd2_H_" outFileNrs[ARGIND,FNR] "_temp_col") }
看:
输入:
$ ls
ccccd2_H_0_col.bak2 ccccd2_H_1_col.bak2 ccccd2_H_2_col.bak2 log.lammps
$ cat log.lammps
1 0 1 2
2 1 0 2
3 1 2 0
$ paste ccccd2_H_0_col.bak2 ccccd2_H_1_col.bak2 ccccd2_H_2_col.bak2 | sed 's/\t/\t\t/g'
N a b c N s t u N k l m
C d e f C v w x C n o p
N g h i N y z a N q r s
C j k l C b c d C t u v
N m n o N e f g N w x y
C p q r C h i j C z a b
脚本执行:
$ awk -f ../tst.awk log.lammps ccccd2_H_0_col.bak2 ccccd2_H_1_col.bak2 ccccd2_H_2_col.bak2
输出:
$ ls
ccccd2_H_0_col.bak2 ccccd2_H_1_col.bak2 ccccd2_H_2_col.bak2 log.lammps
ccccd2_H_0_temp_col ccccd2_H_1_temp_col ccccd2_H_2_temp_col
$ paste ccccd2_H_0_temp_col ccccd2_H_1_temp_col ccccd2_H_2_temp_col | sed 's/\t/\t\t/g'
N a b c N g h i N e f g
C d e f C j k l C h i j
N y z a N m n o N k l m
C b c d C p q r C n o p
N w x y N s t u N q r s
C z a b C v w x C t u v