【问题标题】:How to other write file using gawk script?如何使用 gawk 脚本编写其他文件?
【发布时间】:2014-08-29 17:35:12
【问题描述】:

我已经编写了一个用于从 CSV 文件中删除重复项的代码,现在我想使用其原始名称保存文件。我不想另存为不同的名称。下面是批处理脚本:

代码:

@echo off

C:\sw\awk\bin\gawk.exe "!x[$0]++" *.csv > "{print FILENAME, $0 > FILENAME ".csv"}" file*

我的目标是:我想构建可以在任何 CSV 文件上运行的动态批处理脚本。不应该有任何类型的依赖(文件名)。

Error is :
The filename, directory name or volume label syntax is incorrect. 

请帮帮我。

谢谢。

【问题讨论】:

  • 需要比“它不工作”更好的描述 您是否收到任何错误消息?还有其他输出吗?执行您希望创建的输出文件等。请使用高亮文本编辑框左上角的{} 工具编辑您的问题。不要将此信息作为评论发布! (请!)祝你好运。

标签: batch-file csv awk overwrite gawk


【解决方案1】:

此批处理文件正在尝试将来自gawk 的输出重定向到名为{print FILENAME, $0 > FILENAME 的文件中,该文件名无效。

目前,gawk 代码会生成一个输出,该输出会省略目录中所有 CSV 文件中的所有重复行。

如果您想分别省略每个 CSV 文件中的重复行并单独写出每个文件,则需要在批处理文件中循环以将每个 CSV 文件分别呈现给 gawk 脚本并单独输出每个修改后的文件。您可以按以下方式执行此操作(假设 tmp.tmp 不是文件夹中的现有文件):

for %%f in (*.csv) do (
  gawk.exe "!x[$0]++" "%%f" >tmp.tmp
  copy tmp.tmp "%%f"
)
del tmp.tmp

作为警告,在 DOS 或 Windows 上,如果您通过标准输出写入正在读取的文件,您可以在完成读取之前覆盖正在读取的文件。这就是为什么上面的代码写入一个临时文件,然后将临时文件复制到原始文件。

【讨论】:

  • 我之前也有这个想法,但我不知道如何将文件名存储在变量中,然后在输出名称中使用该变量。
  • 我已经编辑了我的答案,以提供如何将文件名存储在变量等中的示例。
【解决方案2】:

您的尝试存在许多问题。首先,您不能写入正在读取的同一文件(至少,在您读取时不能写入)。其次,您在 awk 脚本之外使用了 awk 特殊变量 FILENAME,它不存在。

以下内容可能一次只适用于一个文件。它读入整个文件,使用行作为关联数组的键,使用行号作为值。然后在END 块中,它按值的顺序打印出数组,写入它刚刚读取的文件。

gawk "!($0 in a) {a[$0] = NR} END {PROCINFO[\"sorted_in\"]=\"@val_num_asc\"; for(x in a) print x >FILENAME}"

【讨论】:

    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多