我有100个csv文件,包含10列和1000行。在第6列中,我有一个数字,我想先添加93
。
例如:
来源:
2014-06-20 00:05:44,2014-06-2000:08:46,x.x.x.x,091xxxx,x.x.x.x,**788950270**,,971xxx,479xxxx,9xxx
结果:
2014-06-20 00:05:44,2014-06-2000:08:46,x.x.x.x,091xxxx,x.x.x.x,**93788950270**,,971xxx,479xxxx,9xxx
答案 0 :(得分:0)
使用它:
awk -F, -vOFS="," '{$6=substr($6,3);$6="**"93$6}1' FILENAME
如果字段#6
尚未**
使用此字段:
awk -F, -vOFS="," '{$6=93$6}1' FILENAME
答案 1 :(得分:0)
您可以使用bash read -a
命令循环访问数据文件,从csv文件读取10个值,前置] 93'来完成您想要做的事情。到第六个元素(基于0的数组上的数组元素5),然后将值写回tmp文件直到完成,然后用tmp文件替换原始(在备份之后)。 注意,具体取决于原始文件末尾是否有尾随新行,您可能需要添加/删除重新格式化操作结束时将出现的换行符。
注意:这仅适用于每行10
个csv值(任意行数)
#!/bin/bash
test -r "$1" || { printf "error invalid file: $1\n"; exit 1; }
tmpfile=./tmp.txt
declare -a array
IFS=$','
:>$tmpfile
while read -a array || test -n "${array[9]}"; do
array[5]="93${array[5]}"
for ((i=0; i<9; i++)); do
printf "${array[i]}," >> $tmpfile
done
printf "${array[9]}\n" >> $tmpfile
done <"$1"
cp -a "$1" "${1}.bak"
cp -a $tmpfile "$1"
rm $tmpfile
exit 0
输入(取自您的示例,并在每条记录上更改日期以使其唯一):
2014-03-20 00:05:44,2014-06-20 00:08:46,x.x.x.x,091xxxx,x.x.x.x,788950270,,971xxx,479xxxx,9xxx
2014-04-20 00:05:44,2014-06-20 00:08:46,x.x.x.x,091xxxx,x.x.x.x,788950270,,971xxx,479xxxx,9xxx
2014-05-20 00:05:44,2014-06-20 00:08:46,x.x.x.x,091xxxx,x.x.x.x,788950270,,971xxx,479xxxx,9xxx
2014-06-20 00:05:44,2014-06-20 00:08:46,x.x.x.x,091xxxx,x.x.x.x,788950270,,971xxx,479xxxx,9xxx
输出
2014-03-20 00:05:44,2014-06-20 00:08:46,x.x.x.x,091xxxx,x.x.x.x,93788950270,,971xxx,479xxxx,9xxx
2014-04-20 00:05:44,2014-06-20 00:08:46,x.x.x.x,091xxxx,x.x.x.x,93788950270,,971xxx,479xxxx,9xxx
2014-05-20 00:05:44,2014-06-20 00:08:46,x.x.x.x,091xxxx,x.x.x.x,93788950270,,971xxx,479xxxx,9xxx
2014-06-20 00:05:44,2014-06-20 00:08:46,x.x.x.x,091xxxx,x.x.x.x,93788950270,,971xxx,479xxxx,9xxx
再次注意如果你的文件是生产文件,这是一个非常重要的操作,所以备份之前,脚本也会备份数据文件,然后验证是否存在原始的尾随换行符。