2015-05-29 55 views
1

我使用以下命令從多個文件中提取第一個「結果」並將它們寫入文件中。shell命令中「sed」的說明

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)的文件,這看起來像:

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

幫你一個忙,註釋代碼!我剛剛與一位同事進行了這次對話。評論下一個人,在你忘記了之前做過的事情之後,這可能就是你自己。有趣的是,這件事後來了。 :-) –

+0

是的,我應該。感謝您的建議 – user3389597

回答

1

這裏的關鍵是2pp代表打印當前模式空間。但是,如果您在前面加上i,這意味着在模式空間中打印i'th行。

在你的情況,grep後的圖案空間是:

<fit_results> 
     <result>0.018300606384717713</result> 
     <result>-0.083118623723832552</result> 
</fit_results> 

因此,2p拿起在此第二行,因此,第一結果。

+0

謝謝。現在有道理 – user3389597

2

更基本的問題是,只要你在shell中編寫一個循環來操縱文本,你就有錯誤的方法。你的整個命令行可以簡化爲:

awk -F'[<>]' 'FNR==1{cnt=0} /result/&&(++cnt==2){print $3}' *.xml > tmp.txt 
+1

最佳答案!另一方面,我會說這是一個'xmllint'的任務。 – hek2mgl

+0

非常感謝。這真的有助於更好地理解 – user3389597