我使用以下命令从多个文件中提取第一个“结果”并将其写入文件。
for file in *.xml; do cat $file | grep result | sed -n 2p | sed s:"<result>":"": | sed s:"</result>":"": >> tmp.txt; done
我在2年后看着它,我不记得我是如何在第一个“结果”(0.018300606384717713)中从其中2个(第二个是-0.083118623723832552)从文件看起来像这样的数字:< / p>
<?xml version="1.0" encoding="UTF-8"?>
<fit_results>
<input_file>/Users/hunululu/Desktop/current/m203/ratios/tmp.xml</input_file>
<time>Fri Oct 17 17:45:51 2014</time>
<fit_converged>true</fit_converged>
<iterations>3</iterations>
<dof>1</dof>
<chi_sqr_per_dof>0.088802954844880599</chi_sqr_per_dof>
<Q>0.76570450204332174</Q>
<parameter_values>
<parameter>
<name>a</name>
<result>0.018300606384717713</result>
<error>0.0090474462765945517</error>
</parameter>
<parameter>
<name>b</name>
<result>-0.083118623723832552</result>
<error>0.045747262135131625</error>
</parameter>
</parameter_values>
</fit_results>
任何人都可以帮助我理解它是如何拿起第一个而不是第二个结果吗?感谢。
答案 0 :(得分:2)
更基本的问题是,无论何时在shell中编写循环只是为了操作文本,你都会采用错误的方法。您的整个命令行可以简化为:
awk -F'[<>]' 'FNR==1{cnt=0} /result/&&(++cnt==2){print $3}' *.xml > tmp.txt
答案 1 :(得分:1)
这里的关键是2p
。 p
代表打印当前模式空间。但如果您在前面添加一些数字i
,则意味着在模式空间中打印i'th
行。
在您的情况下,grep
之后的模式空间是:
<fit_results>
<result>0.018300606384717713</result>
<result>-0.083118623723832552</result>
</fit_results>
因此,2p
选择了第二行,因此得到了第一个结果。