【问题标题】:Processing data swapped over files BASH处理交换文件 BASH 的数据
【发布时间】:2018-10-29 19:47:50
【问题描述】:

首先,我想为我的非常关于编码的基本知识道歉。然后我希望我能够正确地表达我的问题。不要犹豫,要求进一步澄清或其他任何事情......

我在后处理数据时遇到了麻烦...

我的目标是重新组合交换的数据。

编辑:这是一个 .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 倍。

你能告诉我我的问题吗?我认为这与我的包含单行的文件和包含笛卡尔坐标的文件的行号差异有关,但我真的不明白这个链接也没有解决它的方法......

提前谢谢你...

【问题讨论】:

  • 请发布一些简洁、可测试的示例输入和预期输出。
  • 我在帖子drive.google.com/file/d/1AEPUc8haT5_Z3LR3jnZZlpyfxhdDwwo6/…中添加了一个指向我的谷歌驱动器的链接
  • 我用我的例子编辑了我的帖子
  • 我的错,我复制/粘贴了名字......我按照你的建议扩展了我的解释。我希望它更清楚..
  • 如您所见,没有人理解这个问题,您创建了很多文件而没有给出示例。 ccccd2_H_${a}_temp_col.bak2 , rep_$repl , torder.$a.

标签: bash for-loop awk batch-processing


【解决方案1】:

我想我明白你现在想要做什么,这个 GNU awk 脚本(用于 ARGIND、ENDFILE 和内置的打开文件管理)会做到这一点:

$ cat ../tst.awk
ARGIND == 1 {
    for (inFileNr=2; inFileNr<=NF; inFileNr++) {
        outFileNrs[inFileNr,NR] = $inFileNr
    }
    next
}
ENDFILE { RS = "" }
{ print ORS $0 > ("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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多