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