我有一个包含学生联系信息的数据集,样本数据集如下
First Name, Last Name, Address, Phone Number
John, Doe, "House # 11, Street xyz, Road, Area",00000000
Sara, Taylor, "Jake Lake%, Apartment #22, Main Road, Area XYZ", 00000000我正在运行下面的命令来替换,内部地址列,以将其加载到DB中。
awk '!(NR%2){gsub(",","|")} {printf RFS $0} {RFS="\""}' RS=\" fileName.txt > output.txt我面临的问题是,每当我运行此命令时,它将返回以下错误,最初运行的是ok。
awk: run time error: not enough arguments passed to printf(""Jake Lake%, Apartment #22, Main Road, Area XYZ")有什么解决办法吗?我注意到%即将出现在地址中,这是问题所在吗?
发布于 2021-10-21 13:11:34
printf $0,始终使用printf "%s", $0,因为当输入包含printf格式字符时,前者将失败(正如您当前看到的那样)。这同样适用于对任何输入数据使用printf。RFS,以避免与内置变量名称发生冲突,并避免混淆代码,使代码看起来像是在使用内置变量。RS ),除非您需要将它们设置为不同输入文件的不同值,在脚本开始之前或开始时设置变量,因此在读取脚本时,我们会在看到它们被使用之前看到它们正在设置。/.../),而不是string ("...")分隔符,除非出于某种原因需要动态而不是静态的regexp。RS和RFS )时,不要分别将它们设置为相同的值,例如RS="\""; RFS="\"",或者将它们一起设置为该值,例如RS=RFS="\"",或者将其中一个设置为另一个,例如RS="\""; RFS=RS。以下是如何正确地编写问题中的代码:
$ awk -v RS='"' '!(NR%2){gsub(/,/,"|")} {printf "%s%s", rfs, $0; rfs=RS}' file
First Name, Last Name, Address, Phone Number
John, Doe, "House # 11| Street xyz| Road| Area",00000000
Sara, Taylor, "Jake Lake%| Apartment #22| Main Road| Area XYZ", 00000000若要使用使用awk的CSV做更多的工作,请参见undefined。
发布于 2021-10-21 09:54:05
您所得到的错误是由于将RFS (一个空变量)和$0的值作为格式字符串与printf连接所致。
您的文件是一个有效的CSV文件,除了在一些分隔逗号之后有空格(这会扰乱Address字段的引用;引用的字段需要在分隔符后面直接具有初始引号)。我们可以使用csvformat (来自https://csvkit.readthedocs.io/en/latest/的csvkit的一部分)来纠正这个问题:
$ csvformat --skipinitialspace file.csv >fixed-file.csv
$ cat fixed-file.csv
First Name,Last Name,Address,Phone Number
John,Doe,"House # 11, Street xyz, Road, Area",00000000
Sara,Taylor,"Jake Lake%, Apartment #22, Main Road, Area XYZ",00000000能够解析CSV的数据库应该能够按原样读取它。
您是否仍然希望将所有嵌入的逗号替换到|中,只需将文件的分隔符更改为逗号以外的分隔符(我将在下面使用制表符),将其余的逗号更改为管道,并再次更改为使用逗号分隔符。
我们可以直接在原始数据上这样做:
$ csvformat --skipinitialspace --out-tabs file.csv | tr ',' '|' | csvformat --tabs >fixed-file.csv
$ cat fixed-file.csv
First Name,Last Name,Address,Phone Number
John,Doe,House # 11| Street xyz| Road| Area,00000000
Sara,Taylor,Jake Lake%| Apartment #22| Main Road| Area XYZ,00000000使用的各种long选项的短变体是-S for --skipinitialspace、-T for --out-tabs和-t for --tabs。
https://unix.stackexchange.com/questions/674185
复制相似问题