如何使用awk进行文件复制。在awk中使用拆分复制不起作用

时间:2014-03-07 16:33:54

标签: unix awk

我错过了一些微妙的东西。我尝试在命令下运行,但它没有用。你能帮忙吗?

ls | awk '{ split($1,a,".gz")} {cp " "   $1 " "  a[1]".gz"}'

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

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

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

2 个答案:

答案 0 :(得分:5)

总结一些评论并指出第一个例子的错误:

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

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

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

结果

>> test.gz_monkey test.gz<<
  ^ the space here is because cp was "" when cmd was assigned

请注意,您可以使用;分隔语句,而不是使用两个操作块。 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

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

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

虽然我个人认为,以下内容更具可读性:

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

答案 1 :(得分:4)

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

for f in *; do cp "$f" "${f%.gz*}.gz"; done