"Object_Type" "710" "30" "14" "Partner" "Rpt" "Cool" "0ICPRP900" "Des_Space" "HBBREX" "soon_Type" "FY28" "Jan" "50" "USD_US" #Mi #Mi #Mi 0.006641 0 0 0 0 0 0 0 0 0
"Object_Type" "710" "30" "14" "Partner" "Rpt" "Cool" "0ICPRP 900" "Des_Space" "HBBREX" "soon_Type" "FY28" "Jan" "50" "USD_US" #Mi #Mi #Mi 0.01 0 0 0 0 0 0 0 0 0
"Object_Type" "710" "30" "14" "Partner" "Rpt" "Cool" "0ICPRP A&B_900" "Des_Space" "HBBREX" "soon_Type" "FY28" "Jan" "50" "USD_US" #Mi #Mi #Mi 0.641 0 0 0 0 0 0 0 0 0
寻找输出行:
0ICPRP900 0.006641
0ICPRP 900 0.01
0ICPRP A&B_900 0.641
我尝试了下面的命令,它打印了第 8 列(在有空格特殊字符后未打印该列)
awk '{a[$8]+=$17+$18+$19+$20+$21+$22+$23+$24+$25+$26+$27+$28}END{for (i in a)
print i,bc a[i]}' File.txt
输出:
"0ICPRP900" 0.006641
"0ICPRP 0.01
"0ICPRP 0.641
关于如何获取第 16 列到第 28 列之和的唯一第 8 列(“”中的第 8 列)的任何建议
最佳答案
使用任何 awk:
$ awk -F'"' '{n=split($31,f," "); sum=0; for (i=4; i<=n; i++) sum+=f[i]; print $16, sum}' file
0ICPRP900 0.006641
0ICPRP 900 0.01
0ICPRP A&B_900 0.641
或者使用 GNU awk 进行 FPAT 和 gensub():
$ awk -v FPAT='"[^"]*"|[^ ]+' '{sum=0; for (i=19; i<=NF; i++) sum+=$i; print gensub(/"/,"","g",$8), sum}' file
0ICPRP900 0.006641
0ICPRP 900 0.01
0ICPRP A&B_900 0.641
或者,如果通过unique column8
表示您想要对输入文件中多次出现的相同 $8 值进行求和,您可以执行以下任一操作:
任何 awk:
awk -F'"' '
{
n = split($31,f," ")
for (i=4; i<=n; i++) {
sum[$16] += f[i]
}
}
END {
for (key in sum) {
print key, sum[key]
}
}
' file
GNU awk:
awk -v FPAT='"[^"]*"|[^ ]+' '
{
for (i=19; i<=NF; i++) {
sum[gensub(/"/,"","g",$8)] += $i
}
}
END {
for (key in sum) {
print key, sum[key]
}
}
' file
关于Unix:文件有 28 列,以空格分隔,打印第 8 列唯一值以及第 16 列到第 28 列的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67638613/