2014-01-11 28 views
1

我有很多線,如分割文件由子從IBM行i外殼

inv_2007_43324234234.csv 
inv_2007_43377774234.csv 
inv_2007_43999994234.csv 
inv_2011_43324265765.csv 
inv_2007_43324298743.csv 
inv_2008_97545234234.csv 
inv_2011_43888234288.csv 

一個大文件...

第二部分「 '' 是那一年。
有沒有辦法在一年之內將文件分成幾個文件? 行不排序。每年應該有一個文件,其中包含年份在線的文件。 我使用ibm i shell。

感謝到目前爲止 喬吉


我試過很多次讓運行命令,但現在我有我想在回答中描述的錯誤。 基本問題由anubhava回答。 但我有另一個崩潰我的命令的問題。

我創造我的文件與

ls > myfiles.dat 

myfiles的列表中包含上述descrived的CSV文件。 如果我嘗試awk命令

awk -F'_' '{out=$2 ".csv"; print > out}' myfiles.dat 

使用這個名單,我得到它被命名的.csv一個CSV文件。
現在我加載myfiles.dat到我的電腦,並在記事本++中打開它。
我複製它的一部分,並創建一個新文件myfilefromnotepad.dat。
現在我從我的電腦加載新的文件到服務器,並運行命令 - 它的工作原理?

但是爲什麼不能awk不能與ls創建的列表一起工作?

回答

3

如果AWK可用,你可以這樣做:

awk -F'_' '{out=$2 ".csv"; print > out}' file 
+1

謝謝 - 爲我工作! – user1121575

+0

對不起,有一個問題:我的測試文件工作正常。最後我有CRLF。我的真實文件非常大,由ls -d $ PWD/*創建,並在最後有LF。如果我嘗試將awk命令運行到我的真實文件jaust,則會創建一個.csv文件。 testfile和realfile的唯一區別在於行數和行結束。 – user1121575

+0

嘿anubhava,問題是,這些文件看起來完全相同。他們之間沒有區別。我在回答中描述了我的問題。你有想法嗎? – user1121575

1

一個shell唯一的解決辦法:

while read; do 
test -n "$REPLY" && echo $REPLY >> $(expr "$REPLY" : '\(inv_.*\)_').dat; 
done < myfiles.dat 

驗證:

while read; do 
test -n "$REPLY" && echo $REPLY >> $(expr "$REPLY" : '\(inv_.*\)_').dat; 
done <<END 
inv_2007_43324234234.csv 
inv_2007_43377774234.csv 
inv_2007_43999994234.csv 
inv_2011_43324265765.csv 
inv_2007_43324298743.csv 
inv_2008_97545234234.csv 
inv_2011_43888234288.csv 
END 

結果:

head inv_*.dat 
==> inv_2007.dat <== 
inv_2007_43324234234.csv 
inv_2007_43377774234.csv 
inv_2007_43999994234.csv 
inv_2007_43324298743.csv 

==> inv_2008.dat <== 
inv_2008_97545234234.csv 

==> inv_2011.dat <== 
inv_2011_43324265765.csv 
inv_2011_43888234288.csv 
+0

不適合我嗎?我將列表中的所有文件作爲單個文件獲取? – user1121575

+0

@ user1121575你能舉個例子嗎?你是從'QSH'提示符運行的嗎?這聽起來像是某種類型的錯字。 – jamesallman

+0

嗨,詹姆斯,我在qsh中運行命令。如果我將你的例子複製到我的記事本上,並在qsh中運行腳本,我會得到和你一樣的結果。但我使用我的列表文件作爲輸入,我得到一個名爲.dat的大文件,並且沒有幾個文件與[year] .dat – user1121575