![如何在 awk 命令中添加变量](https://linux22.com/image/179249/%E5%A6%82%E4%BD%95%E5%9C%A8%20awk%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E6%B7%BB%E5%8A%A0%E5%8F%98%E9%87%8F.png)
使用我的代码,我尝试根据名称的输入,对 csv 文件中列的特定名称的值进行求和。这是我的代码:
#!/bin/bash
updatedata() {
index=0
while IFS="" read -r line
do
IFS=';' read -ra array <<< "$line"
for arrpos in "${array[@]}"
do
if [ "$arrpos" == *"$1"* ] || [ "$1" == "$arrpos" ]
then
break
else
let index=index+1
fi
done
break
done < data.csv
((index=$index+1))
if [ $pos -eq 0 ]
then
v0=$(awk -F";", -v index=$index '{x+=$index}END{print x}' ./data.csv )
elif [ $pos -eq 1 ]
then
v1=$(awk -F";" '{x+=$index}END{print x}' ./data.csv )
elif [ $pos -eq 2 ]
then
v2=$(awk -F";" '{x+=$index}END{print x}' ./data.csv )
elif [ $pos -eq 3 ]
then
v3=$(awk -F";" '{x+=$index}END{print x}' ./data.csv )
fi
}
在代码中间,你可以在 v0= 中看到,我试图进行一些实验,但我不断收到错误。首先我尝试了这个:
v0=$(awk -F";" '{x+=$index}END{print x}' ./data.csv)
但它给了我这个错误:'awk:第 1 行:} 处或附近的语法错误'
所以我决定尝试一下(正如你在代码中看到的)
v0=$(awk -F";", -v index=$index '{x+=$index}END{print x}' ./data.csv )
我收到此错误:'awk:运行时错误:无法命令行分配给索引类型冲突或关键字 FILENAME="" FNR=0 NR=0'
我不知道该怎么办,你们能帮助我吗
答案1
鉴于 中的一些 CSV 数据data.csv
,
A;B;C
1;2;3
4;5;6
-1.2;3;3.3
colname
以下脚本将计算由命令行上给定的变量命名的列的总和:
BEGIN {
FS = ";"
if (colname == "") {
print "Did not get column name (colname) to work with" >"/dev/stderr"
exit 1
}
}
FNR == 1 {
colnum = 0
for (i = 1; i <= NF; ++i)
if ($i == colname) {
colnum = i
break
}
if (colnum == 0) {
printf "Did not find named column (colname = \"%s\")\n", colname >"/dev/stderr"
exit 1
}
sum = 0
next
}
{
sum += $colnum
}
END {
print sum
}
测试它:
$ awk -v colname='A' -f script.awk data.csv
3.8
$ awk -v colname='B' -f script.awk data.csv
10
$ awk -v colname='C' -f script.awk data.csv
12.3
$ awk -v colname='D' -f script.awk data.csv
Did not find named column (colname = "D")
脚本的较短变体,没有太多的错误检查:
BEGIN { FS = ";" }
FNR == 1 {
for (i = 1; i <= NF; ++i)
if ($i == colname) break
if (i > NF) exit 1
next
}
{ sum += $i }
END { print sum }
或者,作为“一行”:
$ awk -v colname='A' -F ';' 'FNR == 1 { for (i = 1; i <= NF; ++i) if ($i == colname) break; if (i > NF) exit 1; next } { sum += $i } END { print sum }' data.csv
不过,理想情况下,您应该使用某种形式的 CSV 解析器,例如 CSVkit:
$ csvstat --sum -c A data.csv
3.8
该csvstat
实用程序可以计算任何给定 CSV 文件的多种不同统计数据。在这里,它发现分隔符是;
独立的。在此示例中,我要求它提供名为 的列的总和A
。