我有一个input_file
5列的大型csv文件。我想对第二栏做两件事:
(1)删除最后一个字符(2)附加前导和尾随单引号
以下是来自的示例行 input_file.dat
420374,2014-04-06T18:44:58.314Z,214537888,12462,1
420374,2014-04-06T18:44:58.325Z,214537850,10471,1
281626,2014-04-06T09:40:13.032Z,214535653,1883,1
示例输出如下所示:
420374,'2014-04-06T18:44:58.314',214537888,12462,1
420374,'2014-04-06T18:44:58.325',214537850,10471,1
281626,'2014-04-06T09:40:13.032',214535653,1883,1
我写了下面的代码来做同样的事情。
#!/bin/sh
inputfilename=input_file.dat
outputfilename=output_file.dat
count=1
while read line
do
echo $count
count=$((count + 1))
v1=$(echo $line | cut -d ',' -f1)
v2=$(echo $line | cut -d ',' -f2)
v3=$(echo $line | cut -d ',' -f3)
v4=$(echo $line | cut -d ',' -f4)
v5=$(echo $line | cut -d ',' -f5)
v2len=${#v2}
v2len=$((v2len -1))
newv2=${v2:0:$v2len}
newv2="'$newv2'"
row=$v1,$newv2,$v3,$v4,$v5
echo $row >> $outputfilename
done < $inputfilename
但这需要很多时间。
有什么有效的方法可以做到这一点吗?
你可以做到这一点 awk
awk -v q="'" 'BEGIN{FS=OFS=","} {$2=q substr($2,1,length($2)-1) q}1' input_file.dat
怎么运行的:
BEGIN{FS=OFS=","}
:将输入和输出字段分隔符(FS
,OFS
)设置为,
。-v q="'"
:为变量分配文字单引号q
(以避免在awk
表达式中进行复杂的转义){$2=q substr($2,1,length($2)-1) q}
:将第二个字段($2
)替换为单引号(q
),然后替换第二个字段的值,且不带最后一个字符(substr(string, start, length)
),并q
在末尾附加一个文字单引号()。1
:只需调用默认操作,即print
当前(已编辑)行。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句