modifica file in script shell


-2

Sono nuovo di Linux. Sto eseguendo un pacchetto di simulazione su Linux. Per ogni iterazione, verrà generato un file come di seguito. Devo apportare alcune modifiche e quindi utilizzare il file modificato come input per la successiva iterazione. Voglio finire questa modifica con lo script della shell, quindi non ho bisogno di farlo manualmente dopo ogni iterazione. La modifica è la seguente: ci sono coordinate xyz dalla nona riga (sotto diretta). La terza colonna di ogni riga dovrebbe essere moltiplicata per una costante (diciamo 1.03).

Come dovrei farlo in shell script? Posso farlo in MATLAB ma non ho familiarità con i comandi in Linux.

Grazie!

#### il file generato inizia dalla riga successiva

POSCAR for FCC Cu (created manually) 

   1.00000000000000

   7.6799999999999997    0.0000000000000000    0.0000000000000000

   3.8399999999999999    6.6509999999999998    0.0000000000000000

   0.0000000000000000    0.0000000000000000   41.0000000000000000
  72  40  40

Selective dynamics

Direct

  0.0000000000000000  0.0000000000000000  1.0000000000000000   F   F   F 

  0.9999979999999979  0.3328410000000019  1.0000000000000000   F   F   F

  0.9999960000000030  0.6656819999999968  0.0000000000000000   F   F   F

  0.3328369999999978  0.0000000000000000  0.0000000000000000   F   F   F

  0.3328360000000004  0.3328410000000019  2.0000000000000000   F   F   F

  0.3328339999999983  0.6656819999999968  3.0000000000000000   F   F   F

  0.6656750000000002  0.0000000000000000  5.0000000000000000   F   F   F

  0.6656729999999982  0.3328410000000019  2.0000000000000000   F   F   F

  0.6656710000000032  0.6656819999999968  1.0000000000000000   F   F   F

Potresti dare un'occhiata a bc per la parte di calcolo: sostanzialmentetech.com/blog/?/archives/… Per quanto riguarda l'accesso e la modifica di un numero specifico, penso che sed o awk dovrebbero essere utili (anche se la sintassi non è quella facile).
Fotone,

Il file è veramente a doppia spaziatura? Ho provato a correggere la formattazione, ma quell'aspetto non era chiaro.
Steeldriver,

No, dovrebbe essere a spaziatura singola. La prima volta che ho inviato la mia domanda, ho scoperto che il contenuto del file era tutto incasinato. Quindi ho usato il doppio spazio per chiarirlo. Dispiace per la confusione.
user293303,

Risposte:


0

Per modificare il terzo campo separato da spazi in tutte le righe non vuote al di sotto del nono, preservando la formattazione dei numeri, è possibile fare qualcosa di simile

awk 'NR>9 && NF {$3=sprintf("%.16f",$3*1.03);} 1' file

Si noti che in realtà non controlla che $3sia un campo numerico prima di tentare di moltiplicarlo.


Grazie mille. Sei così carino. È quello che voglio. Proverò ad implementarlo nel mio file shell ed eseguirò.
user293303,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.