2013-04-17 81 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(永远是使用它时要小心),但它有其用途。

相关问题