将目录中所有文件的第n列复制到一个文件中

时间:2013-04-17 02:54:28

标签: python bash awk

我有一个包含许多.csv文件的目录。如何将每个文件的第n列逐列提取到新文件中?

例如:

档案A:

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

更新

我不是想加入两个文件。特定目录中有100个文件,我想将所有文件的第n列复制到一个文件中。我给出了两个文件作为示例,以显示如果只有两个文件,我希望数据是什么。

正如评论中所指出的,加入两个文件是微不足道的,但加入多个文件可能并不容易,这就是我的问题的全部要点。 python会帮助完成这项工作吗?

4 个答案:

答案 0 :(得分:1)

基于三联的解决方案,这是一个使用eval的通用版本:

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

我不太喜欢eval(使用时总是要小心),但它有它的用途。

答案 1 :(得分:0)

嗯。我的第一个想法是同时具有外循环和内循环。外部循环将是行号上的计数器。内部循环将通过csv文件。您需要在内部循环中使用head / tail来获取正确的行号,以便您可以获取正确的字段。

另一种方法是使用你现在拥有的一个循环,但是将每一行写入一个单独的文件然后合并它们。

这些似乎都不理想。老实说,我在Perl中这样做,所以你可以使用实际的内存数据结构,避免需要复杂的逻辑。

答案 2 :(得分:0)

假设Bash流程替换是可以接受的(即,您不需要将解决方案移植到Bash不可用的系统);

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

POSIX解决方案需要临时文件。

答案 3 :(得分:0)

这一个班轮应该有效:

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