2010-03-19 69 views
2

我grepped這些,我如何提取值?如何使用bash和awk從這些數據中提取值?

 
... 
cavity_2mgl_wt_strip57001.out: Total cavity volume (A3)    : ( 1.240E+01) 
cavity_2mgl_wt_strip58001.out: Total cavity volume (A3)    : ( 2.408E+00) 
cavity_2mgl_wt_strip60001.out: Total cavity volume (A3)    : ( 4.935E+00) 
cavity_2mgl_wt_strip61001.out: Total cavity volume (A3)    : ( 1.319E+00) 
cavity_2mgl_wt_strip63001.out: Total cavity volume (A3)    : ( 1.532E-01) 
cavity_2mgl_wt_strip64001.out: Total cavity volume (A3)    : ( 1.137E+01) 
... 

,我需要在文件名中指數#粗體:

 
cavity_2mgl_wt_strip76001.out: Total cavity volume (A3)    : ( 1.276E+01) 

,我需要在括號中的數字:

 
cavity_2mgl_wt_strip76001.out: Total cavity volume (A3)    : ( 1.276E+01) 
+1

你能有點更具體的犯錯? – amelvin

+0

我想創建一個文件,其中包含文件名中的數值。與括號中的值匹配。 –

回答

1

肯定是在Perl比短了很多AWK。我不知道你的格式有多靈活,我把幾個通配符以防萬一:

perl -ne 'if ($_ =~ /cavity_[0-9]+mgl_wt_strip([0-9]+)\.out:[^:]+: *\(*([0-9]+\.[0-9]+E[+-][0-9]+)\)/) {print "$1 $2\n"}' in.txt > out.txt 
6
$ ..<commands>.. | awk -F"[:)(]" '{gsub(".*strip|.out","",$1);print $1,$(NF-1)}' 
57001 1.240E+01 
58001 2.408E+00 
60001 4.935E+00 
61001 1.319E+00 
63001 1.532E-01 
64001 1.137E+01 

,或者如果你grepped值已經在一個文件中

$ awk -F"[:)(]" '{gsub(".*strip|.out","",$1);print $1,$(NF-1)}' file 
+0

熱潮!它的炸彈。 –

1

如何使用sed的?

sed -e 's/.*strip\([^.]*\).*(*\([^)]*\) *).*/\1 \2/' infile > outfile 

第一次捕獲是「strip」和下一個點之間的線的一部分。 然後直到最後一個開口括號被跳過。 第二次捕獲是最後一對括號之間的數字(刪除了任何前導和尾隨空格)。

1

在純bash下

while read line; do 
    tmp="${line#*strip}"; index="${tmp%.out*}" 
    tmp="${line##*(}"; value="${tmp%)*}" 
    printf "%s:%s\n" "$index" "$value" 
done < file 
+0

小小挑逗,把'-r'與讀 – ghostdog74

2
sed 's/.*strip\(.*\).out.*(\([^:].*\))/\1 \2/' file