[英]Count and sum up specific decimal number (bash,awk,perl)
我有一個制表符分隔的文件,我想在輸出(1.5)每次找到數字時都將某個十進制數字求和,而不是將字符排到第一列,並打印出從第一行到最后一行的所有行的結果。
我有看起來像這樣的示例文件:
它有8行
1st-column 2nd-Column
a ship
1 name
b school
c book
2 blah
e blah
3 ...
9 ...
現在,我希望我的腳本逐行讀取,如果它發現數字總和為1.5,則只為第一列提供輸出,如下所示:
0
1.5
1.5
1.5
3
3
4.5
6
我的腳本是:
#!/bin/bash
for c in {1..8}
do
awk 'NR==$c { if (/^[0-9]/) sum+=1.5} END {print sum }' file
done
但我沒有任何輸出!
感謝您的幫助。
您的預期輸出中的最后一項似乎不正確。 如果是,則可以執行以下操作:
$ awk '$1~/^[[:digit:]]+$/{sum+=1.5}{print sum+0}' file
0
1.5
1.5
1.5
3
3
4.5
6
use warnings;
use strict;
my $sum = 0;
while (<DATA>) {
my $data = (split)[0]; # 1st column
$sum += 1.5 if $data =~ /^\d+$/;
print "$sum\n";
}
__DATA__
a ship
1 name
b school
c book
2 blah
e blah
3 ...
6 ...
怎么樣
perl -lane 'next unless $F[0]=~/^\d+$/; $c+=1.5; END{print $c}' file
要么
awk '$1~/^[0-9]+$/{c+=1.5}END{print c}' file
這些只會產生最終的總和,就像您的腳本會做的那樣。 如果要顯示數字的增長,請使用:
perl -lane 'BEGIN{$c=0}$c+=1.5 if $F[0]=~/^\d+$/; print "$c"' file
要么
awk 'BEGIN{c=0}{if($1~/^[0-9]+$/){c+=1.5}{print c}}' file
為什么不使用awk:
awk '{if (/^[0-9]+[[:blank:]]/) sum+=1.5} {print sum+0 }' file
根據jaypal的答案進行了簡化編輯,限制了數字並使用制表符和空格。
我不確定每次$ 1中是否有任何數字時,是否要將第一個字段乘以1.5或將1.5加到總和上,否則忽略該行的內容。 這都是awk,使用示例數據作為“文件”的內容。
$ awk '$1~/^[0-9]+$/{val=$1*1.5}{print val+0}' file 0 1.5 1.5 1.5 3 3 4.5 9
$ awk '$1~/^[0-9]+$/{sum+=1.5}{print sum+0}' file 0 1.5 1.5 1.5 3 3 4.5 6
或者,假設數據在STDIN上,則在這里使用ksh(或者bash(如果您有更新的bash可以執行浮點數學運算))
#!/usr/bin/ksh
sum=0
while read a b
do
[[ "$a" == +([0-9]) ]] && (( sum += 1.5 ))
print $sum
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.