考虑以下示例:
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列(进程日期和值日期)的内容?结果将写入新文件。
答案 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
特别是内部有|