awk - 使用 AWK 通过匹配、重命名和赋值来提取列

标签 awk aggregate

我有一个制表符分隔的 csv 文件,其中包含对象长度的汇总统计数据:

sampled. objs.  obj. min. len.  obj. mean. len. obj. max. len.  obj. std.
50  22  60  95  5

我想通过搜索匹配的列标题 obj 来获取有关最小和最大长度的信息。分钟。 len.obj。最大限度。长度。。然后我想创建一个新的 csv 文件,用新的列标题以逗号分隔以获得结果

object_minimum,object_maximum
22,95

我首先打印新标题。然后我尝试检索匹配项的索引,然后使用这些索引从第二行中提取:

#!/bin/awk -f

BEGIN {
    cols="object_minimum:object_maximum"
    FS="\t"
    RS="\n"
    col_count=split(cols, col_arr, ":");
    for(i=1; i<=col_count; i++) printf col_arr[i] ((i==col_count) ? "\n" : ",");
}
{
    for (i=1; i<=NF; i++) {
        if(index($i,"obj. min. len.") !=0) {
        data["object_minimum"]=i;
        }
        if(index($i,"obj. max. len.") !=0) {
        data["object_maximum"]=i;
        }  
    }
}
END NR==1 {
    for (j=1; j<=col_count; j++) printf NF==data[j] ((i==col_count) ? "\n" : ",");
}

可能会有更多的列并且顺序不同,因此有必要进行匹配以找到位置,而且我可能必须通过更改 cols 来选择更多的列并寻找更多火柴。我通过运行来执行

awk -f awk_script.awk original.csv > new.csv

最佳答案

使用awk:

awk 'BEGIN {FS="\t"; OFS=","}
     NR==1 {for (i=1; i<=NF; i++){f[$i] = i}}  # fill array with header
     NR> 1 {print $(f["obj. min. len."]), $(f["obj. max. len."])}' file

输出:

22,95

来源:https://unix.stackexchange.com/a/359699/74329

参见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

关于awk - 使用 AWK 通过匹配、重命名和赋值来提取列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65184486/

相关文章:

sorting - 使用 AWK 显示格式化记录

shell - 从路径中获取文件名

r - 在创建表中削减值(value)

r - 为什么我会得到 "unused argument (na.action = NULL)"聚合错误?

SQL Server Sum Aggregate 函数 - 过滤结果集?

mysql - 聚合 MySQL 数据,我正在使用 group by,但它并没有完全按照我的意愿进行

AWK - 替换匹配行上的特定列,然后打印其他行

csv - 从 CSV 文件中过滤掉小于阈值的值

linux - 删除多个文本文件中的重复行(循环)

python - 如何注释 Django QuerySet 聚合带注释的子查询