我正在尝试使用shell脚本读取csv文件,使用以下命令。
cat file.csv | while read -r a b c d e f; do echo "$a:$b:$c:$d:$e:$f"; done
当我运行此命令时,文件中的第一列未正确读取。
对于Ex:如果第一列内容
number1,
number2,
number3,
number4,
(so on)
输出:
::::er1,
::::er2,
::::er3,
::::er4,
某些字符被':'取代 这仅适用于第一列内容。我哪里错了?
答案 0 :(得分:3)
问题是由于很可能是几个问题: -
IFS=,
csv
文件可能有回车符(\r
),这可能会导致read
命令处理输入流的方式。要删除回车符(\r
),请使用tr -d '\r' < oldFile.csv > newFile.csv
并在新文件中执行如下所述的解析。
如果不设置内部字段分隔符(IFS=","
),则从输入流read
读取时不知道在哪里分隔单词。在命令中添加相同内容。
cat file.csv | while IFS="," read -r a b c d e f; do echo "$a:$b:$c:$d:$e:$f"; done
您可以看到它的工作原理如下。我有file.csv
的内容如下。
$ cat file.csv
abc,def,ghi,ijk,lmn,opz
1,2,3,4,5,6
$ cat file.csv | while IFS="," read -r a b c d e f; do echo "$a:$b:$c:$d:$e:$f"; done
abc:def:ghi:ijk:lmn:opz
1:2:3:4:5:6
不建议使用cat
并将其循环播放,而bash爱好者通常将其称为UUOC - Useless Use Of Cat
你可以通过
来避免这种情况#!/bin/bash
while IFS="," read -r a b c d e f;
do
echo "$a:$b:$c:$d:$e:$f"
done < file.csv