我有一个包含许多.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会帮助完成这项工作吗?
答案 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