如何创建一个包含相同字符的x个数字的字符串而不在AWK中循环?

时间:2015-09-05 07:32:16

标签: csv awk sed gawk

我正在尝试在 AWK 中编写 CSV加入程序,该程序将first.csv文件与second.csv文件相连接。假设两个文件中的行数相同,程序现在可以正常工作。

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

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

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

2 个答案:

答案 0 :(得分:4)

以下是使用变量和数组名称的示例代码的另一个答案。

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个逗号。

答案 1 :(得分:1)

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

如果/您愿意,请使用数组而不是var。请注意,与上面发布的另一个解决方案不同,上面的内容将适用于任何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}'

$