如何使用awk进行文件复制。在awk中使用拆分复制无法正常工作

use*_*078 4 unix awk

我缺少一些细微之处。我尝试在命令下运行,但是没有用。你能帮忙吗?

ls | awk '{ split($1,a,".gz")} {cp " "   $1 " "  a[1]".gz"}'
Run Code Online (Sandbox Code Playgroud)

虽然当我尝试打印时显示复制命令。

ls | awk '{ split($1,a,".gz")} {print "cp" " "   $1 " "  a[1]".gz"}'
Run Code Online (Sandbox Code Playgroud)

不知道问题出在哪里。任何指针都会有所帮助

n07*_*337 5

总结一些评论并指出第一个示例出了什么问题:

ls | awk '{ split($1,a,".gz")} {cp " "   $1 " "  a[1]".gz"}'
                                ^ unassigned variable
Run Code Online (Sandbox Code Playgroud)

cp默认为“”,不视为程序cp。如果您在具有一个文件的目录中执行以下操作,test.gz_monkey则会看到原因:

ls | awk '{split($1,a,".gz"); cmd=cp " " $1 " " a[1] ".gz"; print ">>" cmd "<<"  }'
Run Code Online (Sandbox Code Playgroud)

结果是

>> test.gz_monkey test.gz<<
  ^ the space here is because cp was "" when cmd was assigned
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用;而不是两个操作块来分隔语句。Awk确实支持在子Shell中运行命令-一个是system,另一个是getline。通过以下更改,您的概念可以起作用:

ls | awk '{split($1,a,".gz"); cmd="cp  "$1" "a[1]".gz"; system(cmd) }'
                                   ^ notice cp has moved inside a string
Run Code Online (Sandbox Code Playgroud)

注意的另一件事- ls不是仅在当前目录中查找文件的好选择。相反,请尝试find

find . -type f -name "*.gz_*" | awk '{split($1,a,".gz"); cmd="cp  "$1" "a[1]".gz"; system(cmd) }'
Run Code Online (Sandbox Code Playgroud)

就个人而言,我认为以下内容更易读:

find . -type f -name "*.gz_*" | awk '{split($1,a,".gz"); system(sprintf( "cp %s %s.gz", $1, a[1])) }'
Run Code Online (Sandbox Code Playgroud)


Wil*_*ell 4

你为什么要使用awk?尝试:

for f in *; do cp "$f" "${f%.gz*}.gz"; done
Run Code Online (Sandbox Code Playgroud)