Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 替换csv中最后出现的字段_Regex_Bash_Csv_Awk_Sed - Fatal编程技术网

Regex 替换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>

我有一个像这样的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>
 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