从具有可变输入位置的awk调用函数

时间:2018-06-04 15:01:43

标签: unix awk sed

我有一堆不同的文件。我们使用了" |" as delimeter所有文件都包含一个标题为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命令,它可以将列值传递给函数并提供所需的输出。 提前致谢

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,该文件的第一行是标题,其中一列名为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>