AWK - 如何改进这个例子

时间:2012-12-10 13:24:55

标签: awk

目录的内容:

$ ls | awk '1'
ala
cztery.AVI
dwa.AvI
Jeden.aVI
lupa.com
PIĘĆ.AVI
trzy.Avi
zero.avi

此命令打印:

$ ls | awk '$0=tolower($0){a=substr($0,1,length($0)-4)}{if(/avi$/){system("echo "$0" "a"\".mpg\"")}}'
cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi jeden.mpg
pięć.avi pięć.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg

如何改进上述命令?我想打印:

cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi Jeden.mpg
pięć.avi PIĘĆ.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg

4 个答案:

答案 0 :(得分:3)

如何首先使用find来匹配所有avi个文件:

$ find -iname "*.avi" -exec basename {} \; | awk -F. '{print tolower($1) ".avi", $1 ".mpg"}'
cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi Jeden.mpg
pięć.avi PIĘĆ.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg

$ ls -1 # Use the -1 option of ls instead of ls | awk '1'
ala
cztery.AVI
dwa.AvI
Jeden.aVI
lupa.com
PIĘĆ.AVI
trzy.Avi
zero.avi

如果您正在寻找最短的解决方案,请使用ls awk ls *.[aA][vV][iI] | awk -F. '{print tolower($1)".avi",$1".mpg"}' cztery.avi cztery.mpg dwa.avi dwa.mpg jeden.avi Jeden.mpg pięć.avi PIĘĆ.mpg trzy.avi trzy.mpg zero.avi zero.mpg 与我的{{1}}:

{{1}}

答案 1 :(得分:3)

一种方式:

ls  *[aA][vV][iI] | awk '{print tolower($0) " " substr($0,0,length($0)-3)"mpg";}'

答案 2 :(得分:1)

以下是我使用GNU awk

的方式
for i in *.[Aa][Vv][Ii]; do echo "$(echo $i | awk '{ print tolower($0), gensub(/...$/,"mpg","") }')"; done

结果:

cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi Jeden.mpg
pięć.avi PIĘĆ.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg

答案 3 :(得分:1)

ls | awk '{lc=tolower($0)} lc~/\.avi$/{sub(/...$/,"mpg"); print lc,$0}'

请注意,这不适用于包含换行符的文件名。如果你有这种情况,请告诉我们。

你在下面的评论中说:

  

我希望系统运行此命令 - >

ls | awk '{a=substr($0,1,length($0)-4)}/avi$|AVI$/{system("ffmpeg -i "$0" -f avi -vcodec libxvid "a"\".mpg\"")}'

正如我所提到的,那只是没有考虑正确的方法。为了明确这一点,你这样做:

shell ( ls | awk ( system( shell ( ffmpeg ) ) ) )

这不会更有意义吗?

shell ( ls | awk; ffmpeg )

我实际上不明白你为什么要使用awk因为它只是在shell中完成,但假设你有理由,这是实现你发布的正确方法:

ls *.avi *.AVI |
awk '{print $0, substr($0,1,length($0)-3) "\"mpg\""}' |
while read -r orig mpeg
do
    ffmpeg -i "$orig" -f avi -vcodec libxvid "$mpeg"
done

请注意,如果您的文件名中有空格,那将失败,但无论如何,当这是更好的解决方案时,这是毫无意义的修复:

ls *.avi *.AVI |
while IFS= read -r orig
do
    ffmpeg -i "$orig" -f avi -vcodec libxvid "${orig%avi}mpeg"
done

请注意,在您说要实现的解决方案中,将文件名转换为小写的初始要求已经消失。

此外,请注意,此解决方案,因为它基于您所说的实现的内容,将不适用于您最初发布的文件列表,因为它仅适用于以.avi或.AVI结尾的文件,而不适用于.Avi 。如有必要,ls *.[Aa][Vv][Ii]会解决此问题。