对 find 找到的每个文件执行 awk,然后将结果重定向到新文件名

对 find 找到的每个文件执行 awk,然后将结果重定向到新文件名

我试图从 find 中获取结果,然后执行 awk 来打印前两列。然后我想将这些结果重定向到每个文件的新文件名,使用现有文件名并在名称中添加附加后缀。目录中的文件,原始源保留为 file.txt,新文件命名为 file-new.txt

例如:

find -type f -iname "*.txt" -exec awk '{print $1, $2}' {} \;

为了做到这一点,我需要添加什么?使用 sed 会是更好的选择吗?

答案1

最简单的方法是使用 awk 的输出重定向。 awk 输出重定向在简单情况下非常容易使用:第一次使用重定向时打开文件,随后重定向到同一文件名使用现有的文件描述符。

如果你想在文件名中添加后缀,那就很简单

find -type f -iname "*.txt" -exec awk '{print $1, $2 >(FILENAME "-new")}' {} +

但是您可以对文件名进行更复杂的转换(这里仅在每个输入文件的第一行重新计算):

find -type f -iname "*.txt" -exec awk '
    FNR==1 {out=FILENAME; sub(/\.[^.]*$/, "-new&", out) || out = out "-new"}
    {print $1, $2 >out}
' {} +

相关内容