Unix 使用变量输入位置从awk调用函数

Unix 使用变量输入位置从awk调用函数,unix,awk,sed,Unix,Awk,Sed,我有一堆不同的文件。我们使用|作为delimeter,所有文件都包含一个标题为CARDNO的列,但不一定在所有文件中的同一位置。我有一个叫做data_mask的函数。我想申请所有文件中的卡号,将其更改为新卡号 我知道,如果我传入CARDNO的列号,我可以很简单地做到这一点,比如说它是5列文件中的第3列,类似于: awk -v column=$COLNUMBER '{print $1, $2, FUNCTION($column), $4, $5}' FILE 然而,如果我的所有文件都有数百列,并

我有一堆不同的文件。我们使用|作为delimeter,所有文件都包含一个标题为CARDNO的列,但不一定在所有文件中的同一位置。我有一个叫做data_mask的函数。我想申请所有文件中的卡号,将其更改为新卡号

我知道,如果我传入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命令,它可以将列值传递给函数并提供所需的输出。
提前感谢

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

请将您的示例和代码包装在代码标签中,并在您的问题中更加明确。首先,我没有投反对票。第二件事,如果人们试图帮助你而没有任何回报,那么原始海报的责任就是提供所有信息。我总是鼓励人们不要气馁,这就是为什么我再次要求你在这里发布更多细节。同时,在代码标签中发布输入和预期输出的示例也将有助于我们更好地理解你的要求。@OnkarTiwari失去了态度,并感谢善意的建议。看看是否不清楚在这个论坛上提问需要什么。@OnkarTiwari,更新你的帖子,请不要在评论中提及你的输入/输出。谢谢。调用函数之前,我们已经删除了标题。请告诉我更新的命令。另外,请告诉我是否需要替换函数名?这就是为什么在您的问题中需要a的原因之一,以避免在每个不断发展的模糊需求上剥去洋葱皮@克万图尔-玩得开心…:-@安卡蒂瓦里我真的不明白你的问题。如果不再有标题,则无法识别列,除非它具有一组唯一属性。在某个地方,我们需要能够识别该专栏。亲爱的克万图尔,感谢您的快速回复。请您在不考虑标题名称的情况下提出同样的建议。仅考虑列位置。假设用户想要屏蔽第二列,那么他将输入2。在调用函数之前,我们已经重新设计了文件,并且文件上没有头。我们必须根据列位置屏蔽数据。位置也将是可变的。它不会在每个文件中都相同。感谢您的快速响应。我的函数是data_mask{col_val=$1}。怎么称呼它。它不是将值作为参数