sed搜索并替换文件中的每一行,首先是raw

时间:2016-05-24 09:33:22

标签: bash shell csv awk sed

我正在尝试开发一个扫描csv文件的shell脚本(例如下面的例子),并用可读的时间戳替换EPOCH时间戳。

csv文件看起来像(列是EPOCH):

1464007935578, 852111
1464007935600, 852111
1464007935603, 852111
1464007935603, 1900681

我的脚本代码:

#!/bin/bash

file=xxx.csv
while read line; do
    epoch=`echo $line | awk -F',' '{print $1}'`
    miliSec=$(($epoch % 1000 ))
    timeWithoutMiliSec=`echo "$(date +"%T" -d@$(($epoch / 1000)))"`
    fullTime=`echo "$timeWithoutMiliSec,$miliSec"`
    echo $line | awk -F',' '{print $1}'|sed -i 's/[0-9]*/'$fullTime'/g' $file
done <$file

所需的输出

12:52:15,255 852111
12:52:15,257 852111
12:52:15,259 852111
12:52:15,261 1900681

但是当我运行脚本时它会卡住并创建许多以sed *开头的文件 我必须杀死脚本才能阻止它。 我认为问题可能是while循环与sed结合,而两个(sed和while)接受参数$ file

有人可以就此问题提出建议吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

使用$ awk -F, -v OFS=, '{print strftime("%F", $1/1000), $2}' file 2016-05-23, 852111 2016-05-23, 852111 2016-05-23, 852111 2016-05-23, 1900681 &#39; strftime()功能:

.outer{
  height: 1em;
  margin: 0 1em 0 1em;
}

.content{
  border: 1px solid #000;
  border-left: none;
  border-right: none;
}

.innerContent{
  margin: 0 1em 0 1em;
}

.borderLeftRight{
  border-left: 1px solid #000;
  border-right: 1px solid #000;
}

这使用

  

<强>%F

     

相当于指定'%Y-%m-%d'。这是ISO 8601日期格式。

注意我必须除以1000,因为输入中有毫秒数。