2015-06-05 48 views
0

後,我有存儲在一個文件中的以下數據:總結數字串

number1:0 number2=1 minnumber2number3:1 minnumber3:0 minnumber4:0 maxnumber2number3:1 maxnumber3:0 maxnumber4:0 no. of number5 per bucket:35 num: 
number1:0 number2=0 minnumber2number3:3 minnumber3:3 minnumber4:11577215 maxnumber2number3:3 maxnumber3:3 maxnumber4:14707215 no. of number5 per bucket:6 num: 
number1:0 number2=1 minnumber2number3:1 minnumber3:0 minnumber4:0 maxnumber2number3:3 maxnumber3:1 maxnumber4:1882188 no. of number5 per bucket:8 num: 
number1:0 number2=1 minnumber2number3:2 minnumber3:248 minnumber4:10000000 maxnumber2number3:2 maxnumber3:248 maxnumber4:10000000 no. of number5 per bucket:91 num: 
number1:0 number2=1 minnumber2number3:2 minnumber3:239 minnumber4:11641499 maxnumber2number3:2 maxnumber3:244 maxnumber4:2248700 no. of number5 per bucket:8999 num: 
number1:0 number2=1 minnumber2number3:2 minnumber3:251 minnumber4:2000000 maxnumber2number3:2 maxnumber3:251 maxnumber4:2000000 no. of number5 per bucket:8986 num: 
number1:0 number2=1 minnumber2number3:2 minnumber3:232 minnumber4:14775115 maxnumber2number3:1 maxnumber3:0 maxnumber4:0 no. of number5 per bucket:6385 num: 
number1:0 number2=1 minnumber2number3:2 minnumber3:253 minnumber4:9404695 maxnumber2number3:1 maxnumber3:0 maxnumber4:0 no. of number5 per bucket:8863 num: 
number1:0 number2=1 minnumber2number3:3 minnumber3:3 minnumber4:14777215 maxnumber2number3:1 maxnumber3:0 maxnumber4:0 no. of number5 per bucket:2679 num: 

現在我需要後檢索所有號碼「沒有每桶number5的:」,總結起來。例如,我需要總結如下:

35 
6 
8 
91 
8999 
8986 
6385 
8863 
2679 

我知道我可以做到使用的編程語言如Python一樣,但我學習linux命令是有一些Linux命令,如grep等,這可以幫助我做一樣。

回答

1

您可以嘗試SED:

sed -e 's/^.*bucket://' | sed -e 's/[a-zA-Z]*:$//'

1

如果你是通過數字選擇列納:

tr ":" " " <table | awk '{print $21}' 

假設你的數據在文件table,第一個命令轉換:空間和第二獲得21列。

編輯:純awk通過指定字段分隔符。

awk 'BEGIN{FS="[ :]"} {print $21}' table 

第二編輯:與grep選擇並使用awk總結:

grep -oE "no\. of number5 per bucket:[^ ]*" table | awk 'BEGIN{FS=":"} {S+=$2} END{print S}' 

3編輯:閱讀Anton的解決方案後,有人提醒我,你還可以使用sed匹配名稱並獲得組中的解決方案(\1

sed -rn 's/^.*no\. of number5 per bucket:([0-9]*).*/\1/p' table | awk '{S+=$1} END {print S}' 
1

一個簡單的bash腳本也會做:

#!/bin/bash 

declare -i sum=0 

while read -r line; do 
    n=${line##*number5 per bucket:} 
    sum+=$((${n% num:})) 
done <"$1" 

printf "\n the sum is: %d\n\n" $sum 

輸出

$ bash script.sh filename 

the sum is: 36052