2013-04-17 119 views
2

我有一個包含許多.csv文件的目錄。我怎樣才能將每個文件的第n列解壓縮到一個新文件中?將目錄中所有文件的第n列複製到一個文件中

例如:

文件:

111,222,333 
111,222,333 

文件B:

AAA,BBB,CCC 
AAA,BBB,CCC 

文件C:

123,456,789 
456,342,122 

等等...

如果n = 2,我希望我得到的文件是:

222,BBB,456,... 
222,BBB,342,... 

其中...表示會有儘可能多的列文件目錄中的數量。

我嘗試至今:

#!/bin/bash 

for i in `find ./ -iname "*.csv"` 
    do 
    awk -F, '{ print $2}' < $i >> result.csv ## This would append row-wise, not column-wise. 
    done 

UPDATE:

我並不想給剛剛加入兩個文件。在特定目錄中有100個文件,我想將所有文件的第n列複製到一個文件中。我給出了兩個文件作爲示例,說明如果只有兩個文件,我希望數據是如何。

正如在評論中指出的那樣,加入兩個文件是微不足道的,但加入多個文件可能並不那麼容易,這是我的問題的重點。 Python會幫助完成這項工作嗎?

+1

夥計們,如果你在評論問題時留下評論,或者沒有辦法改善,我會很感激。問題是ambiguos還是有解決方案已經存在或者是我的問題的格式錯誤? –

+0

我不是downvoter,我實際上只是簡單地尋找一個明顯的重複,找不到一個;但是這種類型的問題在這裏和其他網站上非常頻繁,所以我會認爲這是downvote的原因。 – tripleee

回答

0

嗯。我的第一個想法是有一個外部和內部循環。外循環將是行號上的計數器。內循環將通過csv文件。您需要在內部循環中使用頭部/尾部以獲取正確的行號,以便您可以抓取正確的字段。

另一種方法是使用現在的一個循環,但將每行寫入單獨的文件,然後合併它們。

這些看起來都不理想。說實話,我會在Perl中這樣做,所以你可以使用一個實際的內存數據結構,並避免需要複雜的邏輯。

0

假設Bash過程替換是可以接受的(即您不需要解決方案可移植到Bash不可用的系統);

paste -d, <(cut -d, -f2 file1) <(cut -d, -f2 file2) <(cut -d, -f2 file3) # etc 

POSIX解決方案需要臨時文件。

+0

不幸的是,這並沒有推廣到兩個以上的文件,這是OP想要的。 –

+0

@KonradRudolph它不怎麼樣?根據需要添加更多列。查看更新的答案。 – tripleee

+0

您正在對文件進行硬編碼。如果你不能這樣做呢? –

0

這個襯墊應該工作:

awk -F, -v OFS="," 'NR==FNR{a[NR]=$2;next}{print a[FNR],$2}' file1 file2 
+0

不幸的是,這並沒有推廣到兩個以上的文件,這是OP想要的。 –

1

大廈triplee的解決方案,下面是它使用eval一個通用版本:

eval paste -d, $(printf "<(cut -d, -f2 %s) " *.csv)

我不是太喜歡的eval(永遠是使用它時要小心),但它有其用途。

相關問題