如何解决读取CSV并使用条件添加数据
我正在尝试读取包含以下数据的CSV文件:
Name Time
John
Ken
Paul
如果要匹配,我想阅读第一列,然后更改时间。例如,如果$ 1 = John,则将John的时间更改为$ 2。
这是我到目前为止所拥有的:
while IFS=,read -r col1 col2
do
echo "$col1"
if[$col1 eq $1] then
echo "$2:$col2"
done < test.csv >> newupdate.csv
要运行./test.sh John 30
。
我正在尝试更新csv,因此制作一个我认为可以的新文件。这样我就可以再次读取更新的文件以进行下一次运行并再次更新。
解决方法
您的shell脚本有许多语法错误。您需要spaces inside [
...]
,通常应该quote your variables.。在寻求人工协助之前,可以尝试http://shellcheck.net/。
while IFS=,read -r col1 col2
do
if [ "$col1" = "$1" ]; then
col2=$2
fi
echo "$col1,$col2" # comma or colon separated?
done < test.csv >newupdate.csv
请注意我们如何始终打印整个当前行,无论是否进行修改(取决于第一个字段)。还请注意the semicolon (or equivalently newline) before then
,和=
as the equality comparison operator for strings.的使用(数字比较运算符是-eq
,带有破折号,而不是eq
。)
但是,使用Awk可能既简单又快速。首先,shell在循环行方面不是很好(或很快)。
awk -F,-v who="$1" -v what="$2" 'BEGIN { OFS=FS }
$1 == who { $2 = what } 1' test.csv >newupdate.csv
在sed
中执行此操作会更加简洁;但是如果您的变量包含对sed
具有特殊含义的字符,则会出现错误症状,这将使您感到困惑。所以不要真的这样做。
sed "s/^$1,.*/$1,$2/" test.csv >newupdate.csv
有很多方法可以使这种方法不那么脆弱,但是对于任何不平凡的脚本,不使用sed
可能是最直接的解决方案。
这些脚本都不使用任何特定于Bash的语法,因此您可以在任何POSIX兼容外壳程序下运行它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。