2014-05-22 99 views
1

我有了格式添加連續的條目中列

0.99987799  17743.000  
    1.9996300  75.000000  
    2.9993899  75.000000  
    3.9991500  102.00000  
    4.9988999  131.00000  
    5.9986601  130.00000  
    6.9984102  152.00000  
    7.9981699  211.00000  
    8.9979200  256.00000  
    9.9976797  259.00000  
    10.997400  341.00000  
    11.997200  373.00000 

我想要做的就是添加數據在第二列,每四行的文件。所以期望的輸出將是

1 17743+75+75+102 
2 131+130+52+211 
3 256+259+341+373 

這怎麼可以在awk中完成?

我知道我可以使用

awk 'FNR == 5 {print $2}' file 

找到文件中的特定元素,但我不知道如何添加一行4個元素。如果我嘗試例如

awk '$2 {print FNR == 5}' file 

我什麼也得不到零,所以我不知道如何解析列先行,然後行。我也試過

awk 'BEGIN{i=4} 
{ 
for (NR>=1 || NR<=i) 
{ 
print $2 
} 
}' filename 

但我在NR<=i得到語法錯誤。我也不知道如何循環整個文件。任何幫助或想法都會比歡迎!或者,在C++中這樣做會更好嗎?我不知道哪個更方便?

我也試過

awk 'BEGIN{sum=0} {{sum += $2} if(FNR%4 == 0) { print sum; sum=0}}' infile.dat 

,但它似乎沒有正常工作......

+0

你能告訴到目前爲止,你所擁有的? – miltonb

+1

@fedorqui:非常感謝您的評論!我更新了我的問題! – Thanos

+0

@miltonb:我一直在努力尋找幾個小時的時間,我不知道如何繼續。任何幫助都比歡迎! – Thanos

回答

1
awk 'NR%4==1{sum=$2; next}{sum+=$2} NR%4==0{print ++j,sum;}' input.txt 

輸出:

1 17995 
2 624 
3 1229 

對於第一組號的第一列,它存儲第二列的值$2,對於接下來的3行添加值第二欄和sum。對於組NR%4==0的最後一行打印結果。

如果你不需要行號,總和結果只是刪除++j,

+0

非常感謝您的回答!它工作正常!我有點困惑,但是......'NR%4'做了什麼?我知道NR是行數,但'%'做了什麼? – Thanos

+0

@Thanos,不客氣,很高興幫助。 '%'是剩餘運算符。 – Ashkan

1
awk '{print $2}' file | paste -d+ - - - - | bc 
+0

非常感謝您的回答!我不明白你的代碼!可能4的因素來自4破折號,但我不知道... – Thanos

+0

@Thanos:'awk'打印第二柱項目; 'paste'以四個一組的形式複製它們,在它們之間插入加號,所以它會添加表達式;最後'bc'計算這些表達式並輸出它們的值。 – CiaPan

1

這對我工作得很好:

awk '{sum += $2} 
FNR%4==0 {print FNR/4, sum; sum = 0} 
END {if(FNR%4){print int(FNR/4)+1, sum}}' awktest.txt 

與結果:

1 17995 
2 624 
3 1229