替换csv中多列中的字符串

时间:2014-10-30 10:06:50

标签: csv awk sed

考虑以下示例:

BRANCH|TXN_ID|CUSTOMER|PROCESS_DATE|VALUE_DATE|AMOUNT|UPLOAD_DATE|NARRATIVE
1|23234|12343|20141030|20141030|2000|20141030|TEST
1|23234|12343|20141030|20141030|2000|20141030|TEST
1|23234|12343|20141030|20141030|2000|20141030|TEST
1|23234|12343|20141030|20141030|2000|20141030|TEST
1|23234|12343|20141030|20141030|2000|20141030|TEST
1|23234|12343|20141030|20141030|2000|20141030|TEST
1|23234|12343|20141030|20141030|2000|20141030|TEST

如果我使用sed 's/20141030/20141029/g',它将替换20141030的所有实例,包括UPLOAD_DATE,这不是我想要的。

从网上看,awk示例只是替换了一个字符串实例。我需要一次性替换所有实例

所以我的问题是,如何在保持文件格式的同时使用unix脚本替换第4列和第5列(进程日期和值日期)的内容?结果将写入新文件。

3 个答案:

答案 0 :(得分:4)

使用awk

awk 'BEGIN{FS=OFS="|"}{sub(20141030,"20141029",$4); sub(20141030,"20141029",$5); print}' inputFile

输出为

BRANCH|TXN_ID|CUSTOMER|PROCESS_DATE|VALUE_DATE|AMOUNT|UPLOAD_DATE|NARRATIVE
1|23234|12343|20141029|20141029|2000|20141030|TEST
1|23234|12343|20141029|20141029|2000|20141030|TEST
1|23234|12343|20141029|20141029|2000|20141030|TEST
1|23234|12343|20141029|20141029|2000|20141030|TEST
1|23234|12343|20141029|20141029|2000|20141030|TEST
1|23234|12343|20141029|20141029|2000|20141030|TEST
1|23234|12343|20141029|20141029|2000|20141030|TEST

答案 1 :(得分:1)

nu11p01n73Rs答案肯定是这个特定问题的最佳解决方案,但我会添加一个可以适用于许多领域的更通用的方法。

只需将要更改的所有字段添加到拆分语句的开头。

awk -F"|" -vOFS="|" '{split("4 5",A," ");for(i in A)sub(20141030,"20141029",$A[i])}1' file

实际上这会更有效率。

  awk 'BEGIN{FS=OFS="|";split("4 5",A," ")}{for(i in A)sub(20141030,"20141029",$A[i])}1' file

答案 2 :(得分:0)

sed 's/^\([0-9]*|\)\{3\}\)20141030/\120141029/' YourFile

在GNU sed上使用sed(posix版本,所以我们--posix特别是内部有|