Linux 脚本不';不要覆盖csv文件
我正在制作一个csv文件来管理学生组。我制作了一个脚本,其中包含三个参数:学生ID、组类型和组ID。 有两种类型的小组,问题小组和实践小组 问题是,我希望脚本修改csv文件,特别是组 所以我的输入看起来像Linux 脚本不';不要覆盖csv文件,linux,bash,Linux,Bash,我正在制作一个csv文件来管理学生组。我制作了一个脚本,其中包含三个参数:学生ID、组类型和组ID。 有两种类型的小组,问题小组和实践小组 问题是,我希望脚本修改csv文件,特别是组 所以我的输入看起来像 ./script.sh niubXXXXXX problems A00 此输入将ID为“niubXXXXXX”的学生更改为问题GRUP A00。所以问题是我创建了一个脚本,该脚本实际上能够正常工作(它确实是我想做的),但不能覆盖csv文件来更改它 #!/bin/bash if [ ! $#
./script.sh niubXXXXXX problems A00
此输入将ID为“niubXXXXXX”的学生更改为问题GRUP A00。所以问题是我创建了一个脚本,该脚本实际上能够正常工作(它确实是我想做的),但不能覆盖csv文件来更改它
#!/bin/bash
if [ ! $# -eq 3 ]
then
echo "Falta argument. Usage: ./script5.sh directori "
exit 1
fi
alumne=$1
columna=$2
grupCanvi=$3
if [ "$columna" = "problemes" ]
then
awk -F';' -v OFS=';' -v id=$alumne -v new_group=$grupCanvi
'{if($1==id)$3=new_group}1' ./alumnes.csv > ./alumnes.csv
echo "Grup de problemes modificat"
fi
if [ "$columna" = "practiques" ]
then
awk -F';' -v OFS=';' -v id=$alumne -v new_group=$grupCanvi
'{if($1==id)$2=new_group}1' ./alumnes.csv > ./alumnes.csv
echo "Grup de pràctiques modificat"
fi
所以当我把代码放在下面的时候:
awk -F';' -v OFS=';' -v id=$alumne -v new_group=$grupCanvi
'{if($1==id)$2=new_group}1' ./alumnes.csv >> ./alumnes.csv
IUB;Grup Pràctiques;Grup Problemes
niubXXXXXXXX;B00;CF0
niubXXXXXXXX;A00;CF0
niubXXXXXXXX;C00;CF0
niubXXXXXXXX;F00;AB0
(附加,而不是覆盖)
它可以正常工作,就像我想要的那样将它添加到我上一个列表的下方,但是,当我试图覆盖它时,csv文件就变成空的
csv文件结构如下所示:
awk -F';' -v OFS=';' -v id=$alumne -v new_group=$grupCanvi
'{if($1==id)$2=new_group}1' ./alumnes.csv >> ./alumnes.csv
IUB;Grup Pràctiques;Grup Problemes
niubXXXXXXXX;B00;CF0
niubXXXXXXXX;A00;CF0
niubXXXXXXXX;C00;CF0
niubXXXXXXXX;F00;AB0
知道我试图覆盖csv文件时会发生什么吗?尝试修改您正在读取的相同数据结构从来都不是一个好主意。如果遍历一个列表,并且正在读取元素n,并且决定要删除它,那么下一个要读取的元素应该是哪个<代码>n或
n+1
这里也发生了类似的事情。一旦bash处理您的命令,它就会看到有一个输出重定向,因此它会打开并截断文件进行写入,一旦准备好重定向,它就会启动您的脚本,它的输入现在是空文件,因此不会在那里写入任何其他内容
简而言之:不要写入正在读取的同一个文件。通常的技术是写入临时文件,完成后替换原始文件(command input>temp;rm input;mv temp input
)。其他技巧包括使用一些明确允许内联修改的软件(如sed-i
),或使用moreutils
中的scape
等实用程序
您的代码可以是:
awk -F';' -v OFS=';' -v id=$alumne -v new_group=$grupCanvi '{if($1==id)$2=new_group}1' ./alumnes.csv > ./alumnes.csv.tmp
rm ./alumnes.csv
mv ./alumnes.csv.tmp