Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何计算多个文件中类似数据行的特定字段?_Bash - Fatal编程技术网

Bash 如何计算多个文件中类似数据行的特定字段?

Bash 如何计算多个文件中类似数据行的特定字段?,bash,Bash,我有一个多文件的结构 1: 2: 我需要为所有文件中所有数据行的第一个字段相同的所有行计算第5个字段中所有数字的总和 例如,对于以50开头的行,它将是656+565=1221的和。对于数字57,分别为343+200=543。在此之后,我希望以“50 string1 string2 1221”的格式显示一个最大和金额的字符串(例如,对于50) 我可能只使用这些命令:printf、echo、wc、tail、head、grep、sort、uniq、cut、tee、tr、read,不使用临时文件 我编写

我有一个多文件的结构

1:

2:

我需要为所有文件中所有数据行的第一个字段相同的所有行计算第5个字段中所有数字的总和

例如,对于以50开头的行,它将是656+565=1221的和。对于数字57,分别为343+200=543。在此之后,我希望以“50 string1 string2 1221”的格式显示一个最大和金额的字符串(例如,对于50)

我可能只使用这些命令:printf、echo、wc、tail、head、grep、sort、uniq、cut、tee、tr、read,不使用临时文件

我编写了一个脚本,但它计算了错误的值:在文件输入上,它只是计算文件中所有行的字段总和,我需要如上所述。。 如何做(或者更确切地说,如何修复它以使其工作)?以下是脚本:

#! /bin/bash

function findMax {

  for file in $* ; do
    cat $file | sort -bd | calcSums 
  done      
} 

function calcSumForSimilar {

  local sum_for_similar=0

  while read -a line ; do
    let sum_for_similar+=${line[4]}      
  done

  echo $sum_for_similar      
}

function calcSums {

  while read -a line; do
    sum=$(cat "${line[@]}"  | grep ${line[0]} | calcSumForSimilar)
  done

  echo ${line[0]} ${line[1]} ${line[2]} $sum
} 

findMax $*
谢谢大家!

您可以使用awk:

awk '{s[$1]+=$5} END{ for (x in s) { print x, s[x]}}' in1 in2
没有awk:

for k in $(cut -f1 -d' ' in1 in2 | sort | uniq); do 
  s=0; 
  for v in $(grep "^$k" in1 in2 | cut -f10 -d' '); do 
    let s+=$v; 
  done; 
  echo $k $v 
done
您可以使用awk:

awk '{s[$1]+=$5} END{ for (x in s) { print x, s[x]}}' in1 in2
没有awk:

for k in $(cut -f1 -d' ' in1 in2 | sort | uniq); do 
  s=0; 
  for v in $(grep "^$k" in1 in2 | cut -f10 -d' '); do 
    let s+=$v; 
  done; 
  echo $k $v 
done

假设使用现代bash,只使用内置的:

declare -A sum strings

# read all the files
while read f1 f2 f3 f4 f5 rest; do
  (( sum[f1] += f5 ))
  strings[f1]="$f2 $f3"
done << *

# calculate the max
max=-1
for key in "${!sum[@]}"; do
  if (( max < sum[key] )); then
    max=${sum[key]}
    max_key=$key
  fi
done
declare-A和字符串
#读取所有文件
读取f1 f2 f3 f4 f5休息时;做
((和[f1]+=f5))
字符串[f1]=“$f2$f3”

完成假设使用现代bash,仅使用内置:

declare -A sum strings

# read all the files
while read f1 f2 f3 f4 f5 rest; do
  (( sum[f1] += f5 ))
  strings[f1]="$f2 $f3"
done << *

# calculate the max
max=-1
for key in "${!sum[@]}"; do
  if (( max < sum[key] )); then
    max=${sum[key]}
    max_key=$key
  fi
done
declare-A和字符串
#读取所有文件
读取f1 f2 f3 f4 f5休息时;做
((和[f1]+=f5))
字符串[f1]=“$f2$f3”

完成
我只能使用命令:printf、echo、wc、tail、head、grep、sort、uniq、cut、tee、tr、read,不使用临时文件听起来像家庭作业
我只能使用命令:printf、echo、wc、tail、head、grep、sort、uniq、cut、tee、tr、read,不使用临时文件听起来像是家庭作业