Обработка данных поменялась поверх файлов BASH - PullRequest
0 голосов
/ 19 мая 2018

Во-первых, я хотел бы извиниться за мои чрезвычайно базовые знания о кодировании.Тогда я надеюсь, что смогу правильно выразить себя по поводу моей проблемы.Не стесняйтесь спрашивать дальнейшие разъяснения или что-нибудь еще ...

У меня возникают проблемы с постобработкой данных ...

Моя цель - рекомбинировать данные, которые были заменены.

РЕДАКТИРОВАТЬ: здесь находится папка .rar с моим тестовым примером, который работает, и тот, который я пытаюсь заставить работать ... (не бойтесь времени, которое требуется для обработки данных)

https://drive.google.com/file/d/1AEPUc8haT5_Z3LR3jnZZlpyfxhdDwwo6/view?usp=sharing

РЕДАКТИРОВАТЬ 2: Вот что я ожидаю на бумаге (это моя папка TestReorder3OK в моем архиве rar)

введите описание изображения здесь

РЕДАКТИРОВАТЬ 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

Это отлично работает на малыхтестовые файлы (как показано здесь), но не в моей реальной системе.Для моей реальной системы у меня есть файл log.lammps, который содержит 14 строк и 10 001 строк, и мои входные файлы, которые содержат 121 121 строк (таким образом, 10 001 * блок из 121 строки).Он создает файлы в 10 раз больше, чем нужно.

Не могли бы вы рассказать мне о моей проблеме?Я думаю, что это связано с разницей номера строки с моими файлами, содержащими одну строку, и файлами, содержащими декартовы координаты, но я действительно не понимаю ни ссылки, ни способа ее решения ...

СпасибоВы заранее ...

1 Ответ

0 голосов
/ 20 мая 2018

Мне кажется, я понимаю, что вы пытаетесь сделать сейчас, и этот скрипт 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
...