簡體   English   中英

計算並匯總特定的十進制數字(bash,awk,perl)

[英]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.

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