我有多个 CSV 文件,我想提取第三列并将其写入新文件,以同样的方式,文件在文件夹中排序。追加的方式应使所有列并排排列,而不是一列在另一列下面。我使用了多个命令
paste -d "," *csv >> Main.csv
导致数据附加顺序不正确。文件排序错误。 (无法理解如何仅附加特定列,整个文件已附加但并排)
cut -d ',' -f1-2 *.csv t.csv
导致将数据一个接一个地附加到另一个下面,而不是并排附加。 (并附加了两列,我可以将其更改为附加一列)。
cut -d ',' -f1-2 File1.csv | paste File2.csv - > Main.csv
此方法适用于 2 个文件,但如何将其扩展到读取多个文件。
Eg:-
File_1.csv
a,32,37
b,26,34
c,56,65
File_2.csv
a,92,60
b,48,63
c,52,23
File_3.csv
a,2,37
b,45,53
c,56,63
.
.
.
.
Output_File.csv
a,37,60,37 . . . .
b,34,63,53 . . . .
c,65,23,63 . . . .
答案1
以下假设
- CSV 数据很“简单”,这意味着它的字段不包含嵌入的逗号或换行符。
- 所有文件都具有相同的行数。
- 当前目录至少包含一个 CSV 文件。
让我们首先获取文件列表:
rm -f out.csv
filelist=( *.csv )
这将创建一个名为 的数组,filelist
其中包含当前目录中与该模式匹配的所有文件的名称*.csv
。我首先删除它out.csv
,因为我们将使用该名称作为结果文件,并且我们不想将其包含在处理中(如果存在)。
然后我们从第一个文件中提取第一列。我们将该列保存到一个名为out.csv
.
cut -d , -f 1 -- "${filelist[0]}" >out.csv
然后,我们循环遍历这些文件,取出每个文件的第三列,并out.csv
通过cut
、paste
和一个名为 的中间文件将其添加到现有文件中out.tmp
。
for file in "${filelist[@]}"; do
cut -d , -f 3 -- "$file" | paste -d , out.csv - >out.tmp &&
mv out.tmp out.csv
done
整个事情,但重写为/bin/sh
(没有数组):
rm -f out.csv
set -- *.csv
cut -d , -f 1 -- "$1" >out.csv
for file do
cut -d , -f 3 -- "$file" | paste -d , out.csv - >out.tmp &&
mv out.tmp out.csv
done
答案2
我发现它很容易使用的代码是。
paste -d"," *csv>>OG.csv
cut --complement -d',' -f3,4,5,7,8,10,.. OG.csv>>Data.csv
如果有任何替代方法,请告知时间。