簡體   English   中英

AWK:具有可變行號的模式匹配多行數據

[英]AWK: Pattern match multiline data with variable line number

我正在嘗試編寫一個腳本,該腳本將分析管道中的數據。 問題是,單個元素以可變的行數描述。 查看示例數據集:

3 14 -30.48 17.23
4  1 -18.01 12.69
4  3 -11.01  2.69
8 12 -21.14 -8.76
8 14 -18.01 -5.69
8 12 -35.14 -1.76
9  2  -1.01 22.69
10 1 -88.88 17.28
10 1   -.88 14.28
10 1   5.88  1.28
10 1  -8.88 -7.28

在這種情況下,第一個條目是定義后續數據所屬的事件的對象。 對於事件編號8,我們有3行數據。 為了簡化我要解決的相當復雜的問題,讓我們想象一下,我想計算以下表達式:

sum_i($2 * ($3 + $4))

其中i接管屬於給定元素的所有行。 我想產生的輸出如下所示:

3=-185.5   [14(-30.48+17.23) ]
4=-30.28   [1(-18.01+12.69) + 3(-11.01+2.69)]
8=-1106.4  [...]

因此,我需要一個腳本來讀取具有相同索引條目的所有行。

我是AWK的新手,幾天前我已經開始學習該語言。 我現在不確定我是否能夠實現自己想要的。 因此:

  1. AWK可以做到嗎?
  2. 如果沒有,那又是什么? SED?
  3. 如果是,怎么辦? 如果提供一個描述如何實現的鏈接,我將不勝感激。

最后,我知道有一個類似的問題: awk模式可以匹配多行嗎? 但是,我沒有一個固定的模式來分隔我的數據。

謝謝!

awk 'id!=$1{if(id){print id"="sum;sum=0};id=$1}{sum+=$2*($3+$4)} END{print id"="sum}' file
3=-185.5
4=-30.28
8=-1133.4
9=43.36
10=-67.2

您可以嘗試以下方法:

awk '{ar[$1]+=$2*($3+$4)}
      END{for (key in ar) 
              {print key"="ar[key]}}' inputFile

對於每條線輸入,我們進行所需的計算並將結果求和到一個數組中。 $1作為數組的鍵。
讀取整個文件后,我們將結果打印在END{...}塊中。

給定樣本輸入的輸出為:

4=-30.28
8=-1133.4
9=43.36
10=-67.2
3=-185.5

如果需要對輸出進行排序,則可能需要查看gawk的asorti函數或Linux的sort -command(例如awk '{...} inputFile' | sort -n )。

此解決方案不需要對輸入進行排序。

另一個類似的awk

$ awk -v OFS="=" 'NR==1{p=$1}
                  p!=$1{print p,s; s=0; p=$1}
                       {s+=$2*($3+$4)}
                    END{print p,s}' file

3=-185.5
4=-30.28
8=-1133.4
9=43.36
10=-67.2

ps。 您對“ 8”的計算似乎不正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM