Linux 脚本不';不要覆盖csv文件

Linux 脚本不';不要覆盖csv文件,linux,bash,Linux,Bash,我正在制作一个csv文件来管理学生组。我制作了一个脚本,其中包含三个参数:学生ID、组类型和组ID。 有两种类型的小组,问题小组和实践小组 问题是,我希望脚本修改csv文件,特别是组 所以我的输入看起来像 ./script.sh niubXXXXXX problems A00 此输入将ID为“niubXXXXXX”的学生更改为问题GRUP A00。所以问题是我创建了一个脚本,该脚本实际上能够正常工作(它确实是我想做的),但不能覆盖csv文件来更改它 #!/bin/bash if [ ! $#

我正在制作一个csv文件来管理学生组。我制作了一个脚本,其中包含三个参数:学生ID、组类型和组ID。 有两种类型的小组,问题小组和实践小组

问题是,我希望脚本修改csv文件,特别是组

所以我的输入看起来像

./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