0

我有一个包含以下类型数据的文件:

4-11-11 12:59:01,C,26,668
4-11-11 12:59:31,C,26,668
4-11-11 13:00:01,C,26,668
4-11-11 13:00:31,C,26,668
4-11-11 13:01:01,C,26,668
4-11-11 13:01:31,C,26,668

我想要以下输出:

12:59:01 26.668
12:59:31 26.668
13:00:01 26.668
13:00:31 26.668
13:01:01 26.668
13:01:31 26.668

这在带有以下行的终端中工作得很好,但在 bash 脚本中却不行,它只是给了我一个空文件。在我添加了 awk 部分后,问题就开始了。

cut -d ' ' -f2 $file | cut -d ',' -f-1,3- | awk -f tmp.csv -F"," '{print $1 " " $2 "." $3}' | sed 's/"//'  > tmp.csv
cp tmp.csv > $file

谁能解释为什么这在脚本中不起作用?

谢谢!

4

3 回答 3

3

我猜你在脚本中的环境是罪魁祸首,但整个事情可以通过使用来完成read

while IFS=' ,' read a b c d e
do
  echo "$b $d.$e"
done < inputfile

也许这可以在不同的层面上解决问题;-)

于 2013-11-14T15:32:19.617 回答
2

有了这个awk,它可以更容易:

$ awk -F'[ ,]' '{print $2, $4"."$5}' file
12:59:01 26.668
12:59:31 26.668
13:00:01 26.668
13:00:31 26.668
13:01:01 26.668
13:01:31 26.668
  • -F'[ ,]'设置两个可能的分隔符:空格和逗号。
  • print $2, $4"."$5根据这些分隔符打印第 2、第 4 和第 5 个字段。

关于为什么您的脚本不起作用,那只是因为您添加了-f tmp.csv不必要的内容。

$ cut -d ' ' -f2 a | cut -d ',' -f-1,3- | awk -F"," '{print $1 " " $2 "." $3}' | sed 's/"//'
12:59:01 26.668
12:59:31 26.668
13:00:01 26.668
13:00:31 26.668
13:01:01 26.668
13:01:31 26.668

你也使用-f tmp.csv然后> tmp.csv这没有意义。注意一个文件不能同时用作标准输入和标准输出。

于 2013-11-14T15:28:06.427 回答
2

您不是在复制临时文件;您只是在擦除原始文件。我不确定为什么您没有收到错误(您应该是,因为cp需要两个参数)。

代替

cp tmp.csh > $file

利用

cp tmp.csv "$file"
于 2013-11-14T15:37:35.193 回答