我开始学习awk。在这里,我试图在一个目录中生成所有歌曲专辑的格式化列表,该目录中有许多子目录(年份范围)。但最后一次gsub替换并没有删除正斜杠。我知道可以使用像sed这样的bash实用程序使用很多方法来完成它。但是我想知道为什么这不能用于awk。
lst=$(mktemp)
find . | grep -vE "\.mp3|\.sh|\."$ > $lst #| tee $lst
gawk -F"/" '{
if(NF>2){
gsub(".tar.gz","",$3)
gsub(".zip","",$3)
gsub(".ZIP","",$3)
gsub("/","",$3)
print $3
}
else
print$0
}' $lst
exit 0
答案 0 :(得分:2)
您使用“/
”作为字段分隔符,因此$3
永远不会有“/
”。
答案 1 :(得分:2)
您可以按照以下方式简化脚本(我的观点):
find . | awk '
!/(\.mp3|\.sh|\.)$/ {
n=split($0,a,"/")
if(n>2){
sub(".tar.gz","",a[3])
sub(".zip","",a[3])
gsub(".ZIP","",a[3])
print a[3]
}
else
print $0
}'
答案 2 :(得分:1)
这很好用:
echo "test/more" | awk '{gsub("/","",$0)}1'
testmore
因此,您的代码中可能存在其他错误。
尝试使用正则表达式。
echo "test/more" | awk '{gsub(/\//,"",$0)}1'
testmore
gsub(regexp, replacement [, target])