使用AWK的Bash oneliner在终端中运行但不在脚本中运行

时间:2013-11-14 15:26:05

标签: bash awk cut

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

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

这在使用以下行的termal中工作正常,但在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

有人可以解释为什么这在脚本中不起作用吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

我想你的脚本中的环境应该受到责备,但整个事情只能使用read完成:

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

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

答案 1 :(得分: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这是没有意义的。请注意,文件不能同时用作stdin和stdout。

答案 2 :(得分:2)

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

而不是

cp tmp.csh > $file

使用

cp tmp.csv "$file"