首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shell脚本中包含awk会使输出为空吗?

在shell脚本中包含awk会使输出为空吗?
EN

Stack Overflow用户
提问于 2016-02-16 00:19:29
回答 2查看 393关注 0票数 0

我做了一个shell脚本,我可以用它来制作MPD的播放列表。我让它像我想要的那样按文件夹和艺术家写歌,但是当我尝试使用awk删除脚本末尾的重复项时,输出变为空。

脚本如下:

代码语言:javascript
复制
(
mpc search artist 'Black Coast' &&
mpc search artist 'ASTR' &&
ls ~/music/HDD/Chill | awk '$0="HDD/Chill/"$0'
) | tee testi.txt;
awk '!v[$0]++' testi.txt | tee testi.txt

但是,如果我在下面加上awk,那么输出就是一个空文件。但是,在脚本文件之外,这行代码可以正常工作。

编辑:它适用于

代码语言:javascript
复制
(
mpc search artist 'Black Coast' &&
mpc search artist 'ASTR' &&
ls ~/music/HDD/Chill | awk '$0="HDD/Chill/"$0'
) | awk '!v[$0]++' | tee testi.txt

所以我想这个问题变成了为什么上面的例子不起作用?

EN

回答 2

Stack Overflow用户

发布于 2016-02-16 00:21:51

您正在向正在读取的同一文件中写入数据。永远不要这样做,因为shell可以在读取之前写入它。你想要这样的东西(未经测试):

代码语言:javascript
复制
(awk '!v[$0]++' testi.txt | tee tmp.txt) && mv tmp.txt testi.txt
票数 0
EN

Stack Overflow用户

发布于 2016-02-16 00:24:28

我猜这里的问题是您的输入和输出文件是相同的。这将导致它在awk可以读取之前被截断以进行写入。

我建议这样做:

代码语言:javascript
复制
(
    mpc search artist 'Black Coast' &&
    mpc search artist 'ASTR' &&
    ls ~/music/HDD/Chill | awk '$0="HDD/Chill/"$0'
) | awk '!v[$0]++' | tee testi.txt

这样,输出文件只会被触摸一次。

此外,我真的不喜欢ls系列的外观-我建议使用这样的东西:

代码语言:javascript
复制
( cd ~/music && printf '%s\n' HDD/Chill/* )

这会创建一个额外的子subshell,但不需要外部的子subshell,因此您可以将命令更改为:

代码语言:javascript
复制
{
    mpc search artist 'Black Coast' &&
    mpc search artist 'ASTR' &&
    ( cd ~/music && printf '%s\n' HDD/Chill/* )
} | awk '!v[$0]++' | tee testi.txt

如果您的文件名包含换行符,则此操作将失败(但话又说回来,您的原始方法也是如此)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35414153

复制
相关文章

相似问题

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