2014-07-08 23 views
0

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

代码:

@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. 

请帮我这个。

谢谢。

+1

需要比“它不工作”更好的描述您是否收到任何错误消息?任何其他输出?执行epxect创建的输出文件等等。请使用高亮文本上的编辑框左上方的工具编辑您的问题.DONT将此信息作为注释发布! (请!)祝你好运。 – shellter

回答

2

该批处理文件试图将输出从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,如果您通过标准输出写到您正在阅读的文件时,你可以在完成阅读之前覆盖正在阅读的文件。这就是为什么上面的代码写入临时文件,然后将临时文件复制到原始文件。

+0

我之前也有过这个想法,但我不知道如何在变量中存储文件名,然后在输出名称中使用该变量。 –

+0

我编辑了我的答案,以提供如何在变量中存储文件名的示例等。 – Simon

+0

非常感谢!它的工作:) –

1

您的尝试有许多问题。首先,你不能写入你正在阅读的文件(至少,而不是你正在阅读的文件)。其次,您使用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}" 
+0

提供的代码不运行:(它只是挂起 –

相关问题