首页 > 解决方案 > 使用可变输入位置从 awk 调用函数

问题描述

我有一堆不同的文件。我们使用了“|” 作为分隔符 所有文件都包含标题为 CARDNO 的列,但不一定在所有文件的同一位置。我有一个名为 data_mask 的函数。我想在所有文件中申请 CARDNO 以将它们更改为 NEWCARDNO。

我知道,如果我传入 CARDNO 的列号,我可以很简单地做到这一点,比如它是 5 列文件中的第 3 列,例如:

awk -v column=$COLNUMBER '{print $1, $2, FUNCTION($column), $4, $5}' FILE

但是,如果我所有的文件都有数百列,并且在每个文件中都是任意的,那么这将非常乏味。我正在寻找一种方法来做一些事情:

awk -v column=$COLNUMBER '{print #All columns before $column, FUNCTION($column), #All columns after $column}' FILE

我的函数将字符串作为输入并将其更改为新字符串。它将列的值作为输入,而不是列号。请建议我 Unix 命令,它可以将列值传递给函数并给出所需的输出。提前致谢

标签: unixawksed

解决方案


如果我正确理解您的问题,文件的第一行是标题,其中一个列名为CARDNO. 如果是这种情况,那么您只需在该文件中搜索标题并进行相应处理。

awk 'BEGIN{FS=OFS="|";c=1}
     (NR==1){while($c != "CARDNO" && c<=NF) c++
             if(c>NF) exit
             $c="NEWCARDNO" }
     (NR!=1){$c=FUNCTION($c)}
     {print}' <file>

根据评论,如果文件中没有标题,但您知道每个文件,它是哪个列号,那么您可以简单地执行以下操作:

awk -v c=$column 'BEGIN{FS=OFS="|"}{$c=FUNCTION($c)}1' <file>

推荐阅读