Bash эхо из входного файла с дополнительными данными

300
user3179273

В настоящее время у меня есть тысячи файлов .jdx, и мне удалось найти способ получить нужные мне строки из файлов, отраженных в новом файле. Похоже, я не могу получить дополнительные данные, которые мне нужны.

Это то, что я надеюсь, что конечный результат будет выглядеть ..

--- 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) 

и это файл, из которого его читают ..

##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= 

Пакетный файл, который я придумал, таков.

#!/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 

Теперь я, кажется, не могу заставить это работать. Прежде чем я стану еще более серым, есть ли какая-нибудь добрая душа, которая сможет мне помочь?

Спасибо

1
`echo \ r` не делает то, что вы думаете, делает. Проверьте ваш код с помощью [ShellCheck - инструмент анализа сценариев оболочки] (https://www.shellcheck.net/) DavidPostill 6 лет назад 0
Хорошо, спасибо за ссылку. Я удалил \ r и скрипт запустился, но, похоже, не извлекал данные из .jdx .. user3179273 6 лет назад 0
На самом деле .. Это работает :) - Спасибо за совет по этой проверке! Удивительно.. user3179273 6 лет назад 0

2 ответа на вопрос

0
DavidPostill

Теперь я, кажется, не могу заставить это работать.

echo \r не делает то, что вы думаете, что делает.

Проверьте свой код с помощью ShellCheck - инструмента анализа сценариев оболочки и исправьте ошибки / предупреждения:

$ 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.  $  
Хм, подожди. Я так далеко, но теперь второй ряд --- Я не могу приступить к работе. user3179273 6 лет назад 0
@ user3179273 Вы только один раз повторяете `---` в своем скрипте bash. DavidPostill 6 лет назад 0
Да, мне пришлось отредактировать скрипт, так как он не работал. Дайте мне посмотреть, смогу ли я получить немного дальше .. user3179273 6 лет назад 0
@ user3179273 Пожалуйста, прекратите пытаться редактировать мой ответ. Если у вас есть новый код, то отредактируйте ** свой вопрос ** DavidPostill 6 лет назад 0
0
user3179273

Хорошо. Наконец-то разобрались ..

Извиняюсь за то, что не знал, как использовать это место ..

#!/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