如何使用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}文件对两列的网络求和