我做了一个shell脚本,我可以用它来制作MPD的播放列表。我让它像我想要的那样按文件夹和艺术家写歌,但是当我尝试使用awk删除脚本末尾的重复项时,输出变为空。
脚本如下:
(
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,那么输出就是一个空文件。但是,在脚本文件之外,这行代码可以正常工作。
编辑:它适用于
(
mpc search artist 'Black Coast' &&
mpc search artist 'ASTR' &&
ls ~/music/HDD/Chill | awk '$0="HDD/Chill/"$0'
) | awk '!v[$0]++' | tee testi.txt所以我想这个问题变成了为什么上面的例子不起作用?
发布于 2016-02-16 00:21:51
您正在向正在读取的同一文件中写入数据。永远不要这样做,因为shell可以在读取之前写入它。你想要这样的东西(未经测试):
(awk '!v[$0]++' testi.txt | tee tmp.txt) && mv tmp.txt testi.txt发布于 2016-02-16 00:24:28
我猜这里的问题是您的输入和输出文件是相同的。这将导致它在awk可以读取之前被截断以进行写入。
我建议这样做:
(
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系列的外观-我建议使用这样的东西:
( cd ~/music && printf '%s\n' HDD/Chill/* )这会创建一个额外的子subshell,但不需要外部的子subshell,因此您可以将命令更改为:
{
mpc search artist 'Black Coast' &&
mpc search artist 'ASTR' &&
( cd ~/music && printf '%s\n' HDD/Chill/* )
} | awk '!v[$0]++' | tee testi.txt如果您的文件名包含换行符,则此操作将失败(但话又说回来,您的原始方法也是如此)。
https://stackoverflow.com/questions/35414153
复制相似问题