2015-11-16 56 views
-2

我目前正在嘗試編寫一個簡單的shell腳本,它將讀取一個文件,查找某個字符串,然後打印該字符串和幾個字符後。這個請求的上下文是我有一套我想要運行的數據文件。這些文件包含一堆元素電離值。我試圖找到元素並打印出其電離值。Shell/Perl腳本來查找和打印字符串和一些

這裏的一個問題是,數據文件還包含某些離子化時的元素溫度,所以至少有兩個不同的元素將出現在文件中。每個數據文件都是非常標準的,所以我可以通過計算出我期望的元素出現並打印出來,但我想知道是否有更好的方法來做到這一點。首先找到節頭「離子化值」的位置,然後打印出現的第一個所述元素值。

這是否有意義?如果不是,請不要猶豫,要求澄清!

這裏是什麼樣的輸入可以看起來像一個示例:

Log10 Mean Ionisation (over radius) 
Hydrogen -1.881 -0.006-10.514 (H2) 
Helium  -1.433 -0.034 -1.410 
Lithium -3.769 -0.001 -2.531 -4.765 
Beryllium -1.896 -0.704 -0.107 -2.060 -5.793 
Boron  -3.592 -0.118 -0.677 -1.570 -4.884 
Carbon  -3.082 -0.350 -0.259 -2.707 -3.577 -8.864 

Log10 Mean Temperature (over radius) 
Hydrogen 4.068 4.068 4.068 (H2) 
Helium  4.068 4.068 4.068 
Lithium  4.068 4.068 4.068 4.068 
Beryllium 4.068 4.068 4.068 4.068 4.068 
Boron  4.068 4.068 4.068 4.068 4.068 
Carbon  4.068 4.068 4.068 4.068 4.068 4.068 

對於輸出,我真正需要的僅僅是值的元素。打印到控制檯很好

在此先感謝。

+0

假設你正在展示的是一個示例輸入文件,並且顯示給定該輸入的所需輸出。 – jas

+3

有兩件事:輸出結果應該是什麼樣子,到目前爲止您嘗試過了什麼? –

回答

0

您可以將其保存在一個文件中,並使用2個參數調用它,第一個是元素的名稱,第二個是要搜索的文件的名稱。該元素的名稱是區分大小寫:

#!/bin/sh 
sed -n " 
    /Log10 Mean Ionisation (over radius)/,/^[[:space:]]*$/ { 
     /^${1:?}/ p 
    } 
" "${2:?}" 

sed命令默認情況下,什麼也不打印(-n),那麼,下一個空行「LOG10平均電離(超過半徑)」之間的界限,並且它將搜索由行首(/^${1:?})的第一個腳本參數給出的模式(元素),如果找到,則打印行(p)。

${1:?}${2:?}表示法引用位置參數,導致shell打印錯誤消息,如果其中任何參數未設置,則退出。

+0

感謝這! 我想我將使用grep命令來查找我希望打印的行,然後awk打印該行的一部分。現在找出如何在特定標題後找到元素的第一次出現。這我剛剛使用: grep -A 5'Log10平均電離(超過半徑)'文件| grep'Carbon'| awk ... 這可能是不正確的,但它的工作原理! 感謝您的幫助! – dciampa