2

我有一个包含许多 .csv 文件的目录。如何按列将每个文件的第 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,...

where...表示将有与目录中的文件数一样多的列。

到目前为止我的尝试:

#!/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

4 回答 4

1

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

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

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

于 2015-09-16T06:58:33.947 回答
0

这一个班轮应该工作:

awk -F, -v OFS="," 'NR==FNR{a[NR]=$2;next}{print a[FNR],$2}' file1 file2
于 2013-04-17T08:14:44.350 回答
0

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

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

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

于 2013-04-17T04:27:00.787 回答
0

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

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

这些似乎都不理想。老实说,我会在 Perl 中执行此操作,因此您可以使用实际的内存数据结构并避免需要复杂的逻辑。

于 2013-04-17T02:58:14.003 回答