从多个 csv 文件复制特定列并将其写入新的 csv 文件。外壳脚本

从多个 csv 文件复制特定列并将其写入新的 csv 文件。外壳脚本

我有多个 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

以下假设

  1. CSV 数据很“简单”,这意味着它的字段不包含嵌入的逗号或换行符。
  2. 所有文件都具有相同的行数。
  3. 当前目录至少包含一个 CSV 文件。

让我们首先获取文件列表:

rm -f out.csv
filelist=( *.csv )

这将创建一个名为 的数组,filelist其中包含当前目录中与该模式匹配的所有文件的名称*.csv。我首先删除它out.csv,因为我们将使用该名称作为结果文件,并且我们不想将其包含在处理中(如果存在)。

然后我们从第一个文件中提取第一列。我们将该列保存到一个名为out.csv.

cut -d , -f 1 -- "${filelist[0]}" >out.csv

然后,我们循环遍历这些文件,取出每个文件的第三列,并out.csv通过cutpaste和一个名为 的中间文件将其添加到现有文件中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

如果有任何替代方法,请告知时间。

相关内容