Unix:文件有 28 列,以空格分隔,打印第 8 列唯一值以及第 16 列到第 28 列的总和

标签 unix awk sed

示例文件.txt: enter image description here

"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/

相关文章:

linux - linux下如何合并两个文件

awk - 使用 awk 时是否可以将整行存储在变量中?

bash - SED 命令在 Vagrant Init 脚本中不起作用

bash - 在脚本中使用 sed 将文件内容替换为行

bash - 使用 Sed 搜索/替换 Bash 脚本中的变量

linux - 使文件对库函数显示为只读

java - 在 Java Runtime.getRuntime().exec(...) 中使用引号和双引号

linux - 如何对数字前面附加字符的字段进行数字 UNIX 排序

c - Unix top 命令列从另一个 C 程序中选择?

linux - 使用 awk 或 sed 从多个文件中消除重复行