awk使用分隔符获取所有行但最后一个字段

时间:2017-04-03 01:14:47

标签: bash awk

我必须制作一个重命名当前目录中所有文件的单行程序 以“.hola”结尾为“.txt”。

例如:

sample.hola and name.hi.hola将分别重命名为sample.txtname.hi.txt

我在考虑类似的事情:

ls -1 *.hola | awk '{NF="";print "$0.hola $0.txt"}'(*)

然后使用xargs mv -T

将标准输入传递给|

但示例中(*)的输出为samplename hi

如何使用name.hi获取name.hi.hola的输出awk

3 个答案:

答案 0 :(得分:3)

为什么要让awk参与其中?

$ for f in *.hola; do echo mv "$f" "${f%hola}txt"; done
mv name.hi.hola name.hi.txt
mv sample.hola sample.txt

当您对输出感到满意时,请移除echo

答案 1 :(得分:1)

那么,对于您的具体问题,我建议使用rename命令。根据系统上的版本,您可以执行rename -s .hola .txt *.holarename 's/\.hola$/.txt/' *.hola

此外,您不应使用ls来获取文件名。当您运行ls *.hola时, shell 会将*.hola扩展为与该模式匹配的所有文件名列表,而ls只是一个荣耀的echo在那时候。您可以使用例如获得相同的结果printf '%s\n' *.hola没有在shell外运行任何程序。

您的awk错过任何删除.hola的尝试。如果你有GNU awk,你可以这样做:

awk -F. '{old=$0; NF-=1; new=$0".txt"; print old" "new}'

这不适用于BSD / MacOS awk。在这种情况下,你可以这样做:

awk -F. '{
  old=$0; new=$1; 
  for (i=2;i<NF;++i) { new=new"."$i }; 
  print old" "new".txt"; }'

无论哪种方式,我都相信@EdMorton可能有一个更好的基于awk的解决方案。

答案 2 :(得分:0)

这个怎么样?简单明了:

for file in *.hola; do mv "$file" "${file/%hola/txt}"; done