用于将字符串附加到csv文件的第6列中每行的第一行的Shell脚本

时间:2014-06-22 07:47:24

标签: linux shell csv

我有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

2 个答案:

答案 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

再次注意如果你的文件是生产文件,这是一个非常重要的操作,所以备份之前,脚本也会备份数据文件,然后验证是否存在原始的尾随换行符。