gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:38:53 24 4
gpt4 key购买 nike

我有一个制表符分隔的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com