使用IFS嵌套while循环的Bash shell脚本

使用IFS嵌套while循环的Bash shell脚本,bash,while-loop,nested,Bash,While Loop,Nested,我正在尝试使用bash shell脚本解析一组csv文件。这些文件如下所示: File1: /tmp/test.txt key1,key1file.txt key2,key2file.txt key3,key3file.txt Files: /tmp/inter/key1file.txt abc,cdf,123,456 Files: /tmp/inter/key2file.txt abc,cdf,123,456 Files: /tmp/inter/key3file.txt abc,cdf,

我正在尝试使用bash shell脚本解析一组csv文件。这些文件如下所示:

File1: /tmp/test.txt
key1,key1file.txt
key2,key2file.txt
key3,key3file.txt

Files: /tmp/inter/key1file.txt
abc,cdf,123,456

Files: /tmp/inter/key2file.txt
abc,cdf,123,456

Files: /tmp/inter/key3file.txt
abc,cdf,123,456
我尝试使用2个while循环解析这些文件:

while IFS="," read keycol keyfile
do
    while IFS="," read keyval
     do
     echo "inside inner while loop"
     echo "$keycol|$keyval"
    done < "/tmp/inter/$keyfile"
done < /tmp/test.txt

然而,当我运行这段代码时,我没有得到任何输出,这表明第二个循环没有被执行。任何指向正确方向的指针都会有所帮助。谢谢

您在第二个循环中没有按
正确拆分。通常按
IFS
进行拆分,并将值分配给变量,每个变量一个字段,其余的进入提供的最后一个变量。但是,如果只提供一个变量,那么所有内容都存储在那里

相反,让
读取
除以
到一个数组中,然后循环该数组中的值,如下所示:

#!/bin/bash
while IFS="," read keycol keyfile; do
    while IFS="," read -a values; do
        for val in "${values[@]}"; do
            echo "$keycol,$val"
        done
    done < "/tmp/inter/$keyfile"
done < /tmp/test.txt

您在一个位置有
/tmp/test.txt
,在另一个位置有
/tmp/test.csv
。是吗?在外循环中添加打印输出。该循环是否正在运行?通常,
read
无法解析CSV文件;它不能容纳转义为字段一部分的逗号,而不是分隔两个字段。使用具有适当CSV解析器的语言。感谢randomir,您的建议奏效了。由于某种原因,inter文件夹下的文件中缺少换行符,我认为这导致了内部循环无法工作。不客气。问题出在内部循环
read
拆分中。从
inter/$keyfile
获取的每一行
read
都将其“拆分”为一个变量。关键是使用
-a
,将行拆分为多个值,并将它们存储在
bash
数组中。回答得好!。如何将IFS用于嵌套的
for
循环?
#!/bin/bash
while IFS="," read keycol keyfile; do
    while IFS="," read -a values; do
        for val in "${values[@]}"; do
            echo "$keycol,$val"
        done
    done < "/tmp/inter/$keyfile"
done < /tmp/test.txt
key1,abc
key1,cdf
key1,123
key1,456
key2,abc
key2,cdf
key2,123
key2,456
key3,abc
key3,cdf
key3,123
key3,456