Bash-Echo aus Eingabedatei mit zusätzlichen Daten

423
user3179273

Ich habe derzeit Tausende von .jdx-Dateien und es ist mir gelungen, einen Weg zu finden, um die Zeilen, die ich brauche, aus den Dateien in einer neuen Datei wiederzugeben. Was ich nicht tun kann, ist, die zusätzlichen Daten zu erhalten, die ich wiedergeben muss.

So hoffe ich, dass das Endergebnis so aussieht ..

--- title: '1,2-Pentadiene' visible: true ---  * DATA TYPE=MASS SPECTRUM * CAS REGISTRY NO=591-95-7 * MOLFORM=C5H8 * MW=137.3  Download JDX: [10574-36-4-Mass16b9.jdx](10574-36-4-Mass16b9.jdx) 

und dies ist die Datei, aus der gelesen wird ..

##TITLE=1,2-Pentadiene ##JCAMP-DX=4.24 ##DATA TYPE=UV/VIS SPECTRUM ##ORIGIN=INSTITUTE OF ENERGY PROBLEMS OF CHEMICAL PHYSICS, RAS ##CAS REGISTRY NO=591-95-7 ##MOLFORM=C5H8 ##MP=-137.3 ##BP=44.9 ##SOURCE REFERENCE=RAS UV No. 816 ##$NIST SQUIB=1955JON/TAY228-237 ##$NIST SOURCE=TSGMTE ##SPECTROMETER/DATA SYSTEM=Beckman DU ##XUNITS=Wavelength (nm) ##YUNITS=Logarithm epsilon ##XFACTOR=1.000000 ##YFACTOR=1.000000 ##FIRSTX=170.0000 ##LASTX=199.0000 ##FIRSTY=3.2 ##MAXX=199 ##MINX=170 ##MAXY=3.38 ##MINY=2.02 ##NPOINTS=30 ##$REF AUTHOR=Jones, L.C., Jr.; Taylor, L.W. ##$REF TITLE=Far ultraviolet absorption spectra of unsaturated and aromatic hydrocarbons ##$REF JOURNAL=Anal. Chem. ##$REF VOLUME=27 ##$REF NUMBER=2 ##$REF PAGE=228-237 ##$REF DATE=1955 ##XYPOINTS=(XY..XY) 170.0000,3.200002 171.0000,3.190000 172.0000,3.190000 173.0000,3.200000 174.0000,3.240000 175.0000,3.290000 176.0000,3.340000 177.0000,3.380000 178.0000,3.370000 179.0000,3.320000 180.0000,3.320001 181.0000,3.340000 182.0000,3.130000 183.0000,2.940000 184.0000,2.840000 185.0000,2.760000 186.0000,2.700000 187.0000,2.660000 188.0000,2.620000 189.0000,2.570000 190.0000,2.500003 191.0000,2.440000 192.0000,2.370000 193.0000,2.310000 194.0000,2.250000 195.0000,2.220000 196.0000,2.190000 197.0000,2.150000 198.0000,2.080000 199.0000,2.020000 ##END= 

Die Batch-Datei, die ich bisher entwickelt habe, ist diese.

#!/bin/bash while read -r line; do echo \r --- > new.txt; echo \r visible: true >> new.txt; if [[ $line =~ TITLE ]] ; then echo \ title: $$line > new.txt; fi if [[ $line =~ DATA ]] ; then echo \ $$line >> new.txt; fi if [[ $line =~ CAS ]] ; then echo \ $$line >> new.txt; fi if [[ $line =~ MOLFORM ]] ; then echo \ $$line >> new.txt; fi if [[ $line =~ MW ]] ; then echo \ $$line >> new.txt; fi done<*.jdx yourfilenames=`ls *.jdx` for eachfile in $yourfilenames do echo \ \($eachfile\)\[$eachfile\] >> new.txt; done 

Nun, für mein Leben kann ich nicht scheinen, dass dies funktioniert. Bevor ich noch grauer werde, gibt es irgendeinen gütigen Menschen, der mir vielleicht helfen kann?

Vielen Dank

1
`echo \ r` tut nicht das, was Sie denken. Überprüfen Sie Ihren Code mit [ShellCheck - Shell-Skriptanalyse-Tool] (https://www.shellcheck.net/). DavidPostill vor 6 Jahren 0
Okay, danke für den Link. Ich habe das \ r entfernt und das Skript wird ausgeführt, scheint aber keine der Daten aus der .jdx zu ziehen. user3179273 vor 6 Jahren 0
Eigentlich .. SEIN ARBEITEN :) - Danke für den Hinweis auf diesen Checker !! Tolle.. user3179273 vor 6 Jahren 0

2 Antworten auf die Frage

0
DavidPostill

Nun, für mein Leben kann ich nicht scheinen, dass dies funktioniert.

echo \r tut nicht das, was du denkst.

Überprüfen Sie Ihren Code mit dem ShellCheck - Shell-Skript-Analysetool und beheben Sie die Fehler / Warnungen:

$ shellcheck myscript  Line 3: echo \r --- > new.txt; ^-- SC1012: \r is just literal 'r' here. For carriage return, use "$(printf "\r")" instead.  Line 4: echo \r visible: true >> new.txt; ^-- SC1012: \r is just literal 'r' here. For carriage return, use "$(printf "\r")" instead.  Line 11: yourfilenames=`ls *.jdx` ^-- SC2006: Use $(..) instead of legacy `..`. ^-- SC2035: Use ./*glob* or -- *glob* so names with dashes won't become options.  Line 14: echo \ \($eachfile\)\[$eachfile\] >> new.txt; done ^-- SC2086: Double quote to prevent globbing and word splitting. ^-- SC2086: Double quote to prevent globbing and word splitting.  $  
Hmm, warte. Ich bin so weit gekommen, aber jetzt ist die zweite Reihe --- ich kann nicht zur Arbeit kommen. user3179273 vor 6 Jahren 0
@ user3179273 Sie geben in Ihrem Bash-Skript nur einmal "---" aus. DavidPostill vor 6 Jahren 0
Ja, ich musste das Skript bearbeiten, da es nicht lief. Lass mich sehen, ob ich noch ein bisschen weiter kommen kann .. user3179273 vor 6 Jahren 0
@ user3179273 Bitte hören Sie auf, meine Antwort zu bearbeiten. Wenn Sie neuen Code haben, bearbeiten Sie ** Ihre Frage ** DavidPostill vor 6 Jahren 0
0
user3179273

Okay. Endlich haben wir es sortiert ..

Entschuldigung, dass Sie nicht wissen, wie Sie diesen Ort nutzen sollen ..

#!/bin/bash echo --- > new.txt; echo visible: true >> new.txt && while read -r line; do if [[ $line =~ TITLE ]] ; then echo \ title: \'$line\' >> new.txt; fi if [[ $line =~ DATA ]] ; then echo \ --- >> new.txt; fi if [[ $line =~ DATA ]] ; then echo \ $line >> new.txt; fi if [[ $line =~ CAS ]] ; then echo \ $line >> new.txt; fi if [[ $line =~ MOLFORM ]] ; then echo \ $line >> new.txt; fi if [[ $line =~ MW ]] ; then echo \ $line >> new.txt; fi done<*.jdx echo -en '\n' >> new.txt echo -en '\n' >> new.txt  yourfilenames=`ls *.jdx` for eachfile in $yourfilenames do echo Download JDX \ \($eachfile\)\[$eachfile\] >> new.txt; done sed -i 's/##DATA TYPE/ * DATA TYPE/g' *.txt sed -i 's/ title: ##TITLE=/ title: /g' *.txt sed -i 's/##CAS/ * CAS/g' *.txt sed -i 's/##MOLFORM/ * MOLFORM/g' *.txt sed -i 's/##MW/ * MW/g' *.txt