【问题标题】:Read From Multiple CSV Files in a loop in shell在 shell 中循环读取多个 CSV 文件
【发布时间】:2026-02-15 03:00:01
【问题描述】:

我有一个需求是一个一个的读取一些CSV文件,CSV文件会被命名为Test1.csv,Test2 .csv等。代码:

     #!/bin/bash
     IFS=","
     FILES=/CSVFiles/*
     CSVNAME=Test
     n=1
     for f in $FILES 
    while read Column1 Column2 
    do
            echo $Column1
            echo $Column2
    done < "$CSVNAME"$n.csv
    n=$((n+1))

返回这些错误:

./ReadCSV.sh:第 23 行:意外标记 `while' 附近的语法错误

./ReadCSV.sh: line 23: `while read Column1 Column2

【问题讨论】:

  • 请说明有多少个Testn.csv文件,以及这些文件是否需要按特定顺序显示。跨度>
  • 这是一个很好的问题,因为它碰巧不会考虑文件顺序
  • /CSVFiles/ 似乎不太可能真的在根目录中。请cd 到该目录并显示readlink -e Test1.csv 的输出。
  • @agc 可能有 n 个 csv 文件。每个 csv 中有两列,需要逐行打印每列的值。
  • @nkm,我不知道“row wise”是什么意思,请给出输出示例。

标签: bash shell csv


【解决方案1】:

你错过了一个

do

之后

for f in $FILES 

但如果我正确理解您的意图,您可以使用以下代码改进示例:

#!/bin/bash
for file in /CSVFiles/Test*.csv # Use file globbing to get the files
do
/*Use a stream editor like awk to print the lines*/
  awk -v FS="," '{
  /* if you want the columns in separate lines */
  print $1;
  print $2;
  }' "$file"
done

编辑2:如果您需要考虑文件顺序,下面的代码会有所帮助

#!/bin/bash
#Count the total number of files using stat and grep
total=$(stat -f /CSVFiles/Test*.csv | grep -c '^[[:blank:]]*File:')
#User c-style for-loops in bash
for((i=0;i<="$total";i++))
do
awk -v FS="," '{
      /* if you want the columns in separate lines */
      print $1;
      print $2;
      }' "Test${i}.csv" # Feeding the file names in order
done

【讨论】:

  • Test1.csv:for 循环中没有此类文件或目录错误
  • @nkm :包含这些 csv 文件的文件夹的确切路径是什么。您是否按原样使用我的代码?
  • 更正了路径并且能够读取第一个 csv 但第二个 csv 打印值的第一个 csv 本身。
【解决方案2】:

这个怎么样。

IFS=","
FILES=/CSVFiles/*
cat $FILES|while read Column1 Column2
do
echo $Column1
echo $Column2
done

【讨论】:

    【解决方案3】:

    OP 脚本的输出好像就相当于这个单行:

    cut -d, -f1,2 /CSVFiles/Test*.csv | tr , '\n'
    

    【讨论】: