如何在不在 AWK 中循环的情况下创建具有 x 个相同字符的字符串?

How to create a string with x numbers of the same character without looping in AWK?

我正在尝试在 AWK 中编写一个 CSV join 程序,它将 first.csv 文件与 second.csv 文件。假设两个文件中的行数相同,该程序现在可以完美运行。

当其中一个文件包含的行多于另一个文件时,就会出现问题;在这种情况下,我必须向行数较少的文件添加多个逗号(这取决于输入文件中的字段数),这样列就不会错位。

问题是,如何创建和分配包含不同数量逗号的字符串?例如,

if: NumberOfFields==5;然后,我想创建字符串 ",,,,," 并将其添加到 Array[i].

这是另一个答案,其中包含使用您的变量和数组名称的示例代码。

BEGIN {
    NumberOfFields=5;
    i=1;
    Array[i] = gensub(/0/, ",", "g", sprintf("%0*d", NumberOfFields, 0));
    print Array[i];
}

运行 它与 awk -f x,awk 其中 x.awk 是文本文件中的上述代码。请注意,它始终至少打印 1 个逗号,即使您指定零也是如此。

$ awk -v num=3 'BEGIN {var=sprintf("%*s",num,""); gsub(/ /,",",var); print var}'
,,,
$

使用数组代替您喜欢的 var if/when。请注意,与发布的另一个解决方案不同,上面的解决方案适用于任何 awk,而不仅仅是 gawk,如果请求的数字为零,它不会打印任何逗号:

$ awk -v num=0 'BEGIN {var=sprintf("%*s",num,""); gsub(/ /,",",var); print var}'

$

GNU awk 和 gensub() 的等价物是:

$ awk -v num=3 'BEGIN {var=gensub(/ /,",","g",sprintf("%*s",num,"")); print var}'
,,,
$
$ awk -v num=0 'BEGIN {var=gensub(/ /,",","g",sprintf("%*s",num,"")); print var}'

$