管道 awk 输出以添加到循环内的变量
Pipe awk output to add to variable inside loop
我可能会以错误的方式解决这个问题,但我已经尝试了每一种语法,但我被困在了我能遇到的最接近的错误上。
我有一个日志文件,我想在其中筛选出一组行,如下所示:
Files : 1 1 1 1 1
Files : 3 3 4 4 5
Files : 10 4 2 3 1
Files : 254 1 1 1 1
我拥有的代码可以帮助我了解这一点,但是,我想使用 awk 对所有第一个数字列执行加法运算,在本例中,输出为 268(然后在其他列)。
我试图将 awk 输出通过管道传输到循环中以执行最后一步,但它不会添加值,从而引发错误。我认为这可能是由于 awk 将条目作为字符串处理,但由于 bash 不是强类型,所以应该无关紧要?
无论如何,代码是:
x=0;
iconv -f UTF-16 -t UTF-8 "./TestLogs/rbTest.log" | grep "Files :" | grep -v "*.*" | egrep -v "Files : [a-zA-Z]" |awk '{=}1' OFS="," | awk -F "," '{print }' | while read i;
do
$x=$((x+=i));
done
错误信息:
-bash: 0=1: command not found
-bash: 1=4: command not found
-bash: 4=14: command not found
-bash: 14=268: command not found
我尝试了几种不同的加法语法,但我觉得这与我尝试提供的内容有关,而不是加法本身。
目前这只是整数值,但我也希望用浮点数来执行它。
非常感谢任何帮助,我相信有一种不那么复杂的方法可以实现这一目标,仍在学习中。
您可以在 awk 中进行计算:
awk '{for (c=3; c<=NF; c++) sum[c]+=$c} END{printf "Total : ";
for (c=3; c<=NF; c++) printf "%s%s", sum[c], ((c<NF)? OFS:ORS) }' file
输出:
Total : 268 9 8 9 8
此处 sum
是一个关联数组,其中包含从 #3 开始的每一列的总和。
命令分解:
for (c=3; c<=NF; c++) # Iterate from 3rd col to last col
sum[c]+=$c # Add each col value into an array sum with index of col #
END # Execute this block after last record
printf "Total : " # Print literal "Total : "
for (c=3; c<=NF; c++) # Iterate from 3rd col to last col
printf "%s%s", # Use printf to format the output as 2 strings (%s%s)
sum[c], # 1st one is sum for the given index
((c<NF)? OFS:ORS) # 2nd is conditional string. It will print OFS if it is not last
# col and will print ORS if it is last col.
(不是答案,而是格式化评论)
当我看到长长的 greps 和 awks(以及 seds 等)管道时,我总是很烦躁
... | grep "Files :" | grep -v "*.*" | egrep -v "Files : [a-zA-Z]" | awk '{=}1' OFS="," | awk -F "," '{print }'
可以写成
... | awk '/Files : [^[:alpha:]]/ && !/\*/ {print }'
您是否使用 grep -v "*.*"
过滤掉带点的行或带星号的行?因为你正在实现后者。
我可能会以错误的方式解决这个问题,但我已经尝试了每一种语法,但我被困在了我能遇到的最接近的错误上。
我有一个日志文件,我想在其中筛选出一组行,如下所示:
Files : 1 1 1 1 1
Files : 3 3 4 4 5
Files : 10 4 2 3 1
Files : 254 1 1 1 1
我拥有的代码可以帮助我了解这一点,但是,我想使用 awk 对所有第一个数字列执行加法运算,在本例中,输出为 268(然后在其他列)。
我试图将 awk 输出通过管道传输到循环中以执行最后一步,但它不会添加值,从而引发错误。我认为这可能是由于 awk 将条目作为字符串处理,但由于 bash 不是强类型,所以应该无关紧要?
无论如何,代码是:
x=0;
iconv -f UTF-16 -t UTF-8 "./TestLogs/rbTest.log" | grep "Files :" | grep -v "*.*" | egrep -v "Files : [a-zA-Z]" |awk '{=}1' OFS="," | awk -F "," '{print }' | while read i;
do
$x=$((x+=i));
done
错误信息:
-bash: 0=1: command not found
-bash: 1=4: command not found
-bash: 4=14: command not found
-bash: 14=268: command not found
我尝试了几种不同的加法语法,但我觉得这与我尝试提供的内容有关,而不是加法本身。 目前这只是整数值,但我也希望用浮点数来执行它。
非常感谢任何帮助,我相信有一种不那么复杂的方法可以实现这一目标,仍在学习中。
您可以在 awk 中进行计算:
awk '{for (c=3; c<=NF; c++) sum[c]+=$c} END{printf "Total : ";
for (c=3; c<=NF; c++) printf "%s%s", sum[c], ((c<NF)? OFS:ORS) }' file
输出:
Total : 268 9 8 9 8
此处 sum
是一个关联数组,其中包含从 #3 开始的每一列的总和。
命令分解:
for (c=3; c<=NF; c++) # Iterate from 3rd col to last col
sum[c]+=$c # Add each col value into an array sum with index of col #
END # Execute this block after last record
printf "Total : " # Print literal "Total : "
for (c=3; c<=NF; c++) # Iterate from 3rd col to last col
printf "%s%s", # Use printf to format the output as 2 strings (%s%s)
sum[c], # 1st one is sum for the given index
((c<NF)? OFS:ORS) # 2nd is conditional string. It will print OFS if it is not last
# col and will print ORS if it is last col.
(不是答案,而是格式化评论)
当我看到长长的 greps 和 awks(以及 seds 等)管道时,我总是很烦躁
... | grep "Files :" | grep -v "*.*" | egrep -v "Files : [a-zA-Z]" | awk '{=}1' OFS="," | awk -F "," '{print }'
可以写成
... | awk '/Files : [^[:alpha:]]/ && !/\*/ {print }'
您是否使用 grep -v "*.*"
过滤掉带点的行或带星号的行?因为你正在实现后者。