Bash awk使用分隔符获取除最后一个字段之外的所有行

Bash awk使用分隔符获取除最后一个字段之外的所有行,bash,awk,Bash,Awk,我必须用一行代码重命名当前目录中的所有文件 以“.hola”到“.txt”结尾 例如: sample.hola和name.hi.hola将分别重命名为sample.txt和name.hi.txt 我在想这样的事情: ls-1*.hola | awk'{NF=”“;打印“$0.hola$0.txt”}”(*) 然后用| 但示例(*)的输出将是sample和name hi 如何使用awk为name.hi.hola获取输出name.hi?对于您的特定问题,我建议使用重命名命令。根据系统上的版本,您可以

我必须用一行代码重命名当前目录中的所有文件 以“.hola”到“.txt”结尾

例如:

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

我在想这样的事情:

ls-1*.hola | awk'{NF=”“;打印“$0.hola$0.txt”}”
(*)

然后用
|

但示例(*)的输出将是
sample
name hi


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

对于您的特定问题,我建议使用
重命名
命令。根据系统上的版本,您可以执行
rename-s.hola.txt*.hola
,或
rename'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}'
awk -F. '{
  old=$0; new=$1; 
  for (i=2;i<NF;++i) { new=new"."$i }; 
  print old" "new".txt"; }'
这在BSD/MacOS
awk
上不起作用。在这种情况下,您可以执行以下操作:

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

对于(i=2;i对于您的特定问题,我建议使用
rename
命令。根据系统的版本,您可以执行
rename-s.hola.txt*.hola
rename's/\.hola$/.txt/'*.hola


另外,您不应该使用
ls
获取文件名。当您运行
ls*.hola
时,shell会将
*.hola
扩展到与该模式匹配的所有文件名的列表,而
ls
此时只是一个美化的
echo
。您可以使用
printf'%s\n'*.hola
获得相同的结果,而不使用runni在shell之外调用任何程序

并且您的
awk
缺少删除
.hola
的任何尝试。如果您有GNU awk,您可以执行以下操作:

awk -F. '{old=$0; NF-=1; new=$0".txt"; print old" "new}'
awk -F. '{
  old=$0; new=$1; 
  for (i=2;i<NF;++i) { new=new"."$i }; 
  print old" "new".txt"; }'
这在BSD/MacOS
awk
上不起作用。在这种情况下,您可以执行以下操作:

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

对于(i=2;i你为什么要让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

当您对输出满意时,请删除回声。

为什么要将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

当您对输出感到满意时,请删除回声。

这样如何?简单明了:

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

这个怎么样?简单明了:

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

请参阅。然后尝试
echo name.hi.hola | awk'BEGIN{OFS=“.”FS=“”{NF--print}'
。您可以根据您的示例进行调整。马克·里德的答案适合您想要解决的问题。请注意,这样修改
NF
只在GNU awk中有效,而不是在BSD/MacOS awk中。请参阅。然后尝试
echo name.hi.hola | awk'BEGIN{OFS=“.”FS=“。”{NF--;print}'
。您可以根据您的示例进行调整。马克·里德的答案适合您要解决的问题。请注意,像这样修改
NF
只在GNU awk中有效,而不是在BSD/MacOS awk中。我想要
awk
是因为它是用于家庭作业,但现在我看到了您的解决方案,我不知道您可以这样做
${f%hola}.txt
替换“hola”。谢谢!我想要
awk
,因为它是一个家庭作业,但是现在我看到了你的解决方案,我不知道你可以用
${f%hola}.txt
替换“hola”。谢谢!我在GNU,我尝试了你的
awk
解决方案,我得到了相同的输出,输入中的点在
new
中消失。我不知道
rename
comand,我想我还需要做更多的调查。如果我使用
ls-1*。hola
它会在列中列出所有内容。
printf'%s\n'*。hola
也会在列中输出columnIm在GNU,我尝试了你的
awk
解决方案,我得到了相同的输出,输入中的点在
new
中消失。我不知道
重命名
comand,我想我必须进行更多的调查。如果我使用
ls-1*。hola
它将在列中列出所有内容。
printf'%s\n'*。hola
也在列中输出umnmmmm我想我应该更多地了解
bash
命令行。我不知道
${file/%hola/text}
将取代那些“hola”。我认为解决方案是使用
awk
,因为这是关于它的家庭作业。mmmm我想我应该更多地了解
bash
命令行。我不知道
${file/%hola/text}
将替换那些“hola's”。我认为解决方案是使用
awk
,因为这是关于它的家庭作业。