CSV 格式输出

CSV 格式输出

我有以下情况:

包含用户名和另一个值(类似于序列号)的 csv

Test; User; WKCVW432994; ; ;
Test; Users; Middlename; WEJDFH34992; ;
Test; Some; Weird; Guy; WEFDJJ23453;
Test; Some; Even; Weirder; Guy; WEFDJJ23453

我真正需要的是省略分隔符并在名称后面和序列号之前粘贴静态值,例如:

Test User StaticValue WKCVW432994
Test Users Middlename StaticValue WEJDFH34992
Test Some Weird Guy StaticValue WEFDJJ23453
Test Some Even Weirder Guy StaticValue WEFDJJ23453

我已经为一姓一姓的人搞定了:

awk -F";" '{k=$3; $3="StaticValue"; $4=k OFS $(NF--); print}' in.csv > out.csv

我需要的完整名称的名称长度/单元格数量之间的差异是我目前的问题。

答案1

所有你需要的是:

$ awk '{gsub(/;/,FS); $NF="StaticValue " $NF} 1' file
Test User StaticValue WKCVW432994
Test Users Middlename StaticValue WEJDFH34992
Test Some Weird Guy StaticValue WEFDJJ23453
Test Some Even Weirder Guy StaticValue WEFDJJ23453

上面的代码可以在每个 UNIX 机器上的任何 shell 中使用任何 awk 来工作。

答案2

从倒数开始其实是正确的做法。你GNU awk可以尝试

awk -F ";" '{last=NF; while ($last ~ /^[[:space:]]*$/) last--; new=last+1; $new=$last; $last="StaticValue"; print}' in.csv  > out.csv

这将通过 RegExp 匹配和插入(就像您所做的那样)确定最后一个“非空”字段,然后再插入“静态值”。

对于mawk,语法需要稍作修改:

awk -F ";" '{last=NF; while ($last ~ /^ *$/) last--; new=last+1; $new=$last; $last="StaticValue"; print}' in.csv  > out.csv

相关内容