假设文件包含以下内容:
Peter,HongKong,000001HongKong,000001,20150901
Mary,London,000001London,000001,20150901
现在我要替换,例如第3列/字段中的第6个字符为2。
s.t:
Peter,HongKong,000002HongKong,000001,20150901
Mary,London,000002London,000001,20150901
如何将此传递给awk / sed?
感谢您的帮助!
答案 0 :(得分:2)
awk -F, -v OFS="," '$3=substr($3,1,5)"2"substr($3,7)' file
IMO,awk比列分隔数据更适合sed。例如,如果你的要求是改变第45列中的内容,那么sed可以做到,但不像awk那么简单。
答案 1 :(得分:0)
我喜欢这种运动:
击:
# v v
sed -E 's/^([^,]*,[^,]*,.....)./\12/' <<.e
Peter,HongKong,000001HongKong,000001,20150901
Mary,London,000001London,000001,20150901
.e
结果:
Peter,HongKong,000002HongKong,000001,20150901
Mary,London,000002London,000001,20150901
第一个“v”标记您要搜索的内容,第二个“v”标记替换
假设:
654321HongKong
654322HongKong
答案 2 :(得分:0)
你有一个很好的awk答案,比较这里的perl替代方案,这更简单,因为perl支持substr
作为左值:
perl -F, -ane 'substr($F[2], 5, 1) = "2"; print join ",", @F'
输出:
Peter,HongKong,000002HongKong,000001,20150901
Mary,London,000002London,000001,20150901
答案 3 :(得分:0)
这可能适合你(GNU sed):
sed -r 's/^(([^,]*,){2}[^,]{5})[^,]/\12/' file
或者:
sed 's/^\(\([^,]*,\)\{2\}[^,]\{5\}\)[^,]/\12/' file
或其他方式:
sed 's/[^,]*/\n&/3;s/\n\([^,]\{5\}\)[^,]/\12/' file