2014-07-08 45 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

提供的代碼不運行:(它只是掛起 –

相關問題