首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AWK的Bash oneliner在终端上运行,但在脚本中不运行

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

Stack Overflow用户
提问于 2013-11-14 15:26:05
回答 3查看 340关注 0票数 0

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

代码语言:javascript
复制
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

我要输出以下内容:

代码语言:javascript
复制
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部分之后开始的。

代码语言:javascript
复制
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

有人能解释一下为什么这在剧本里行不通吗?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-14 15:28:06

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

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
$ 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
EN

Stack Overflow用户

发布于 2013-11-14 15:32:19

我想应该归咎于脚本中的环境,但是所有的事情都可以用read来完成

代码语言:javascript
复制
while IFS=' ,' read a b c d e
do
  echo "$b $d.$e"
done < inputfile

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

票数 3
EN

Stack Overflow用户

发布于 2013-11-14 15:37:35

您不是在复制临时文件,而是删除原始文件。我不知道为什么您没有得到一个错误(应该是这样,因为cp需要两个参数)。

而不是

代码语言:javascript
复制
cp tmp.csh > $file

使用

代码语言:javascript
复制
cp tmp.csv "$file"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19981592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档