Regex 替换csv中最后出现的字段
我有一个像这样的csv文件Regex 替换csv中最后出现的字段,regex,bash,csv,awk,sed,Regex,Bash,Csv,Awk,Sed,我有一个像这样的csv文件 KEY,F1,F2,STEP,LAST_OCCURRENCE 100.101,a,b,STEP_1,<empty> 100.102,c,d,STEP_1,<empty> 100.103,e,f,STEP_1,<empty> 100.101,g,h,STEP_1,<empty> 100.103,i,j,STEP_1,<empty> 100.101,g,h,STEP_2,<empty>
KEY,F1,F2,STEP,LAST_OCCURRENCE
100.101,a,b,STEP_1,<empty>
100.102,c,d,STEP_1,<empty>
100.103,e,f,STEP_1,<empty>
100.101,g,h,STEP_1,<empty>
100.103,i,j,STEP_1,<empty>
100.101,g,h,STEP_2,<empty>
100.103,i,j,STEP_2,<empty>
哪种方法最快?
可以使用sed脚本完成,或者最好使用另一个(perl?php?)脚本对输入文件进行后处理。使用
tac
和awk
:
tac file |
awk 'BEGIN{FS=OFS=","} $1 != "KEY"{$NF = (seen[$1,$4]++) ? "false" : "true"} 1' |
tac
在使用tac
以相反顺序列出文件之后,我们使用一个组合键为$1,$4
的关联数组seen
,来计算每个组合键的第一次出现。最后,我们执行tac
以按原始顺序恢复文件
输出:
KEY,F1,F2,STEP,LAST_OCCURRENCE
100.101,a,b,STEP_1,false
100.102,c,d,STEP_1,true
100.103,e,f,STEP_1,false
100.101,g,h,STEP_1,true
100.103,i,j,STEP_1,true
100.101,g,h,STEP_2,true
100.103,i,j,STEP_2,true
它实际上是说空的,还是只是空的?因为创建源文件的脚本正在进行中,这是我可以决定的。另一方面,我可以决定存储“(…),\n”字符串或简单地存储“(…),\n”任何最方便解析的内容。
哪种方法最快?
-写得最快还是执行得最快?现在您有了两个可能的解决方案,我怀疑这两个解决方案的编写时间大致相同,如果您关心的是这一点,您可以使用time
测试它们的执行速度。正确的问题!执行速度最快。毫无疑问,因为此脚本必须应用于大量文本文件,数据量约为1.2 Tb
KEY,F1,F2,STEP,LAST_OCCURRENCE
100.101,a,b,STEP_1,false
100.102,c,d,STEP_1,true
100.103,e,f,STEP_1,false
100.101,g,h,STEP_1,true
100.103,i,j,STEP_1,true
100.101,g,h,STEP_2,true
100.103,i,j,STEP_2,true
$ awk 'BEGIN{FS=OFS=","} NR==FNR{last[$1,$4]=NR;next} FNR>1{$NF=(FNR==last[$1,$4] ? "true" : "false")} 1' file file
KEY,F1,F2,STEP,LAST_OCCURRENCE
100.101,a,b,STEP_1,false
100.102,c,d,STEP_1,true
100.103,e,f,STEP_1,false
100.101,g,h,STEP_1,true
100.103,i,j,STEP_1,true
100.101,g,h,STEP_2,true
100.103,i,j,STEP_2,true