如何在unix shell中将一个csv内容映射到另一个csv内容

如何在unix shell中将一个csv内容映射到另一个csv内容,shell,csv,mapping,split,Shell,Csv,Mapping,Split,我有一个带有以下输入的csv Product1,Comp1|Comp2|Comp3|...,Owner1|Owner2|||... Product2,Comp1|Comp2|Comp3|...,Owner1|||Owner3|... Product3,CompX 我把。。。。为了指示以|分隔的Comp列表变量编号,我们可以假设每个Comp csv文件都有一个所有者信息(如果可用),否则将为空 现在我需要生成以下格式的xml <product='Product1' Comp='Comp1'

我有一个带有以下输入的csv

Product1,Comp1|Comp2|Comp3|...,Owner1|Owner2|||...
Product2,Comp1|Comp2|Comp3|...,Owner1|||Owner3|...
Product3,CompX
我把。。。。为了指示以|分隔的Comp列表变量编号,我们可以假设每个Comp csv文件都有一个所有者信息(如果可用),否则将为空

现在我需要生成以下格式的xml

<product='Product1' Comp='Comp1' Owner='Owner1' />
<product='Product1' Comp='Comp2' Owner='Owner2' />
<product='Product1' Comp='Comp3' Owner='' />
.
.
.

<product='Product2' Comp='Comp1' Owner='Owner1' />
<product='Product2' Comp='Comp2' Owner='' />
<product='Product2' Comp='Comp3' Owner='Owner3' />
.
.
.
<product='Product3' Comp='CompX' Owner='' />

.
.
.
.
.
.
我为此编写了以下代码

ifs=$IFS
IFS='
'

for line in `cat input.csv`;do
# echo $line
prd=`echo $line | cut -d',' -f1`
components=`echo $line | cut -d',' -f2`
owners=`echo $line | cut -d',' -f3`

# echo $components

IFS='|'
i=0
for comp in `echo $components`;do
   i=`expr $i + 1`
   IFS=$ifs
   owner=`echo $owners | cut -d'|' -f$i`
   echo "<product='$prd' Comp='$comp' Owner='$owner' />"
done
done
ifs=$ifs
如果
'
对于“cat input.csv”中的行;做
#回音$线
prd=`echo$line | cut-d','-f1`
组件=`echo$line | cut-d','-f2`
所有者=`echo$line | cut-d','-f3`
#echo$组件
IFS=“|”
i=0
对于“echo$组件”中的comp;做
i=`expr$i+1`
IFS=$IFS
所有者=`echo$owners | cut-d'|'-f$i`
回声“”
完成
完成

它不能正常工作。有人能给我推荐其他的方法吗。

不确定
符号。我将使用一个for循环来处理所有的内部列逻辑,并使用一个简单的
while read
方法来逐行处理

读取行时
做
列=(`echo$LINE | tr','''`)
COMPS=(`echo${COLUMNS[1]}|tr'|'''''''`)

为了((i=0;我得到的输出是*'/>duct='Product1'Comp='Comp3'所有者='…*'/>duct='Product2'Comp='Comp3'所有者='…它正在打印一些行,但不正确,我当时用*标记了,是的,我现在看到了。在将内容从windows复制到u时,使用awk搜索匹配的indexOne建议,将脚本调整为映射Comp的所有者nix将确保删除\r字符。