首页 > 解决方案 > BASH循环从其他csv更改1个csv的数据

问题描述

试图根据其他csv中的其他列更改列的值

所以假设我们有一个 CSV_1,它包含超过 1000 行和 3 列的状态

shape   Color    size  
round      2      big  
triangle   1      small   
square     3      medium 

然后我们有一个只有 10 个的 CSV2,其中包含以下信息

color  
1 REd  
2 Blue  
3 Yellow  
etc  

现在我想用 CSV2 的颜色名称更改 CSV_1 中列颜色的值

所以换句话说..像

for (i=0; i<column.color(csv1); i++) { 
if color.csv1=1; then
subustite with color.csv2=1  }

以便循环在所有 CSV1 颜色列中迭代并使用 CSV2 中的值更改值

标签: bash

解决方案


对此的显式循环在 bash 中会非常慢。使用为您执行逐行处理的命令。

sed 's/abc/xyz/'在每一行中搜索abc并将其替换为xyz. 使用它来搜索第二列中的数字并将其替换为第二个文件中的名称。该sed命令可以使用另一个sed命令从第二个文件自动生成:

以下脚本假定 CSV 文件在分隔符周围没有空格,

sed -E "$(sed -E '1d;s#^([^,]*),(.*)#s/^([^,]*,)\1,/\\1\2,/#' 2.csv)" 1.csv

交互式示例

$ cat 1.csv 
shape,Color,size
round,2,big
triangle,1,small
square,3,medium
$ cat 2.csv 
color
1,REd
2,Blue
3,Yellow
$ sed -E "$(sed -E '1d;s#^([^,]*),(.*)#s/^([^,]*,)\1,/\\1\2,/#' 2.csv)" 1.csv
shape,Color,size
round,Blue,big
triangle,REd,small
square,Yellow,medium

推荐阅读