使用AWK重新组织命名字段

使用AWK重新组织命名字段,awk,Awk,我必须处理各种输入文件,这些文件包含许多字段,任意排列,但所有字段的名称和标签都是一致的,并带有标题行。这些文件需要重新格式化,以便所有需要的字段都按特定顺序排列,去掉不相关的字段,并考虑缺少的字段。我希望使用AWK来处理这个问题,因为它在过去处理与领域相关的困境时做得非常好 经过一番胡闹之后,我最终得到了类似以下未经测试的记忆写作: BEGIN {while ((getline < "fieldfile") > 0) fldname[$0] = ++maxflds} NR==1

我必须处理各种输入文件,这些文件包含许多字段,任意排列,但所有字段的名称和标签都是一致的,并带有标题行。这些文件需要重新格式化,以便所有需要的字段都按特定顺序排列,去掉不相关的字段,并考虑缺少的字段。我希望使用AWK来处理这个问题,因为它在过去处理与领域相关的困境时做得非常好

经过一番胡闹之后,我最终得到了类似以下未经测试的记忆写作:

BEGIN {while ((getline < "fieldfile") > 0) fldname[$0] = ++maxflds}

NR==1 {
    for (i=1;i<=NF;i++) fldpos[i] = fldname[$i]
}
现在这个解决方案很好用。我运行它,得到我想要的输出。没有抱怨。然而,对于任何超过三个字段或更多的字段,比如我必须处理的四十多个字段,都会有很多令人痛苦的冗余代码,这些代码总是会困扰我。一想到必须在混乱中插入一个字段,我就不寒而栗

每次我看它的时候,我都会在里面死一点

我相信一定有更优雅的解决方案。或者,如果没有,也许有一种工具更适合这种任务。AWK在它自己的领域里是很棒的,但我担心我可能会用这个来扩展它的局限性


有什么见解吗?

我能想到的唯一建议是将初始数组设置移到BEGIN块中,并从循环中的单独模板文件中读取有序字段名。那么您的awk程序只包含没有嵌入数据的循环。您的外部模板文件将是一个简单的换行分隔列表

BEGIN {while ((getline < "fieldfile") > 0) fldname[++maxflds] = $0}

我喜欢关联数组的想法,但很遗憾,在打印时,除了从头开始编写排序函数之外,没有什么干净的方法来保证数组的顺序,没有什么好办法。我认为头循环中的fldpos[fldname[$I]]=I可以工作,因为它给了我一个整数键,可以在打印时循环…@goldPseudo:Oops,我没有想到这一点。我想你的想法行得通。
BEGIN {while ((getline < "fieldfile") > 0) fldname[$0] = ++maxflds}

NR==1 {
    for (i=1;i<=NF;i++) fldpos[i] = fldname[$i]
}