如何使用270000+有效地求和一个文件中的两列;bash中的行

如何使用270000+有效地求和一个文件中的两列;bash中的行,bash,unix,solaris,performance,awk,Bash,Unix,Solaris,Performance,Awk,我在一个文件中有两列,我想自动对每行的两个值求和 比如说 read write 5 6 read write 10 2 read write 23 44 然后我想对每一行的“读”和“写”求和。最后在求和之后,我找到最大和并将最大值放入一个文件中。我觉得我必须使用grep-v来消除每行的列标题,就像答案中所说的那样,这使得代码效率低下,因为我对整个文件进行grep只是为了读取一行 目前,我在bash脚本(在for循环中,$x是文件名)中有这样的代码,用于逐行求和列 lines=`g

我在一个文件中有两列,我想自动对每行的两个值求和

比如说

read write
5    6
read write
10   2
read write
23   44
然后我想对每一行的“读”和“写”求和。最后在求和之后,我找到最大和并将最大值放入一个文件中。我觉得我必须使用grep-v来消除每行的列标题,就像答案中所说的那样,这使得代码效率低下,因为我对整个文件进行grep只是为了读取一行

目前,我在bash脚本(在for循环中,$x是文件名)中有这样的代码,用于逐行求和列

lines=`grep -v READ $x|wc -l | awk '{print $1}'`
line_num=1
arr_num=0


while [ $line_num -le $lines ]
do

    arr[$arr_num]=`grep -v READ $x |  sed $line_num'q;d' | awk '{print $2 + $3}'`
    echo $line_num
    line_num=$[$line_num+1]
    arr_num=$[$arr_num+1]

done
但是,要求和的文件有270000多行。这个脚本已经运行了几个小时了,还远没有完成。有没有一种更有效的方法来编写此代码,这样它就不会占用这么长的时间?

请改用并利用模函数:

awk '!(NR%2){print $1+$2}' infile
为什么不运行:

awk 'NR==1 { print "sum"; next } { print $1 + $2 }'
您可以在文件上运行它,而另一个脚本仍在运行。最多几秒钟就完成了(预测)。当您确信它是正确的时,您可以终止另一个进程

如果愿意,可以使用Perl或Python代替
awk


您的代码正在输入文件的每一行上运行
grep
sed
awk
;那太贵了。它甚至没有将数据写入文件;它正在Bash的内存中创建一个数组,稍后需要将该数组打印到输出文件中。

awk
可能更快,但实现这一点的惯用方法如下:

while read -a line; do      # read each line one-by-one, into an array
                            # use arithmetic expansion to add col 1 and 2
    echo "$(( ${line[0]} + ${line[1]} ))"
done < <(grep -v READ input.txt)
读取时-一行;把每一行一行读成一个数组
#使用算术展开法添加列1和列2
回显“$(${line[0]}+${line[1]}”)”

完成<你的问题相当冗长,但你的目标并不明确。按照我的理解,你的数字在每一行上,你只想找到最大和。鉴于:

awk '
    NR%2 == 1 {next} 
    NR == 2 {max = $1+$2; next} 
    $1+$2 > max {max = $1+$2}
    END {print max}
' filename

假设始终是一个“标题”行后跟一个“数据”行:

awk '
  BEGIN{ max = 0 }
  {
    if( NR%2 == 0 ){
      sum = $1 + $2;
      if( sum > max ) { max = sum }
    }
  }
  END{ print max }' input.txt
或者简单地修剪掉所有不符合您要求的线条:

grep '^[0-9]\+\s\+[0-9]\+$' input.txt | awk '
  BEGIN{ max = 0 }
  {
    sum = $1 + $2;
    if( sum > max ) { max = sum }
  }
  END{ print max }' input.txt

您还可以将管道与隐式循环输入的工具一起使用,如下所示:

grep -v read INFILE | tr -s ' ' + | bc | sort -rn | head -1 > OUTFILE

这假设读写数据值之间有空格。

位非正统。。导入数据库并从中求和?不清楚读取的挂起是什么;我怀疑您没有告诉我们输入数据格式的全部情况。您的脚本正在读取整个文件,以便为每一行提取一行。难怪要花很长时间。为while循环的每个迭代调用
grep
sed
awk
可能是造成性能问题的主要原因。特别是考虑到
grep
在每次迭代中都能有效地读取整个文件,您需要知道行号吗?您想要的输出格式到底是什么?我在问题中更改了源文件的格式,因为这是相关的。我忘了提那件事了。这就是为什么我必须使用grepThanks!星期五我得试试这个。当我尝试时,我会给你更多的信任。使用你的方法:awk'NR>2{sum+=$4-$5}END{print sum}文件对两列的网络求和