2016-06-13 48 views
0

與另一篇文章相關我有... parsing a sql string for integer values with multiple delimiters, 在哪裏我可以很容易地完成與UNIX工具(ahem)相同。我發現它比預期的更雜亂。我正在尋找awk解決方案。對以下內容有何建議?awk:計算從單個字段中的值與多個分隔符的總和

這是我原來的職位,轉述:

我想用awk來解析從平面文件,它是管道分隔源數據。其中一個字段的格式如下。我的最終狀態是對字段中的整數進行求和,但我的問題在於查看使用awk對字段中的數值求和的方法。子格式的模式將始終在希望的整數前面加一個代字號(〜),後面加一個星號(*),除了字段中的最後一個。子字段的數量也可能會有所不同(我的示例有5個,但可能更多或更少)。 4個字符的TAG名稱並不重要。

所以這裏是一個示例:

| GADS〜55.0 * BILK〜0.0 * BOBB〜81.0 * HETT〜32.0 * IGGR〜51.0 |

從這個例子中,我想要處理的是最後一個數字219.同樣,我可以將總和部分作爲下一步;只是對獲取數字感興趣。

我的解決方案目前需要執行兩個awk的語句。首先使用gsub在目標字段中用'*'分隔符替換'〜',77:

awk -F'|' 'BEGIN {OFS =「|」} {gsub(「〜」,「*」,$ 77); print}'file_1> file_2

我的第二個awk語句是計算目標字段77上的數字總和,它是最後一個字段,並將其替換爲計算值。它建立在文件中其他地方不會有其他星號(*)的假設之上。我沒關係。它適用於大多數例子,但不適用於其他例子,我的直覺告訴我這不是一個可靠的答案。有任何想法嗎?我在另一篇關於SQL的建議很棒,但我無法實現它們的原因是無關緊要的。

awk -F'*''{if(NF> = 2){s = 0; for(i = 1; i < = NF; i ++)s = s + $ i;打印SUBSTR($ 1,1,長度($ 1)-4)S;}其他打印}」 file_2> file_3

+0

[編輯]你的問題解決掉所有的內聯歷史,只是後您的當前問題包括[MCVE]以簡潔,可測試樣品的輸入和預期的輸出。 –

回答

2

爲了讓您的例子總和(219),您可以使用此:

awk -F'[^0-9.]+' '{for(i=1;i<=NF;i++)s+=$i;print s}' file 

219.00如下:

awk -F'[^0-9.]+' '{for(i=1;i<=NF;i++)s+=$i;printf "%.2f\n", s}' file 
+0

謝謝肯特。我喜歡這裏的情況。所以它看起來像使用正則表達式基(和增量?)作爲分隔符來解析該字段。好東西。現在我試圖將它建立到一個聲明中,要求它在分隔符已經建立爲管道「|」的文件內的一個字段(編號77)上「起作用」。這可以在一個聲明中完成,還是需要一系列命令?我正在考慮可能使用sed語句來使用替代 – sirabhorn