脚本不会覆盖CSV文件

时间:2019-03-19 11:08:53

标签: linux bash

我正在处理一个管理学生团体的csv文件。我编写了一个脚本,该脚本获取三个参数:学生ID,组的类型和组ID。 小组有两种类型,问题或练习。

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

所以我的输入看起来像

./script.sh niubXXXXXX problems A00

此输入会将ID为“ niubXXXXXX”的学生更改为问题组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

(附加但不覆盖)

它可以正常工作,将其添加到我的最后一个列表的下面,就像我想要的一样,但是,当我尝试覆盖它时,csv文件变成空的。

csv文件结构如下:

IUB;Grup Pràctiques;Grup Problemes
niubXXXXXXXX;B00;CF0
niubXXXXXXXX;A00;CF0
niubXXXXXXXX;C00;CF0
niubXXXXXXXX;F00;AB0

当我尝试覆盖csv文件时会发生什么事情?

1 个答案:

答案 0 :(得分:1)

尝试修改您正在读取的相同数据结构从来都不是一个好主意。如果遍历列表,并且正在读取元素n,并且决定要删除它,那么哪个元素应该是下一个要读取的元素? n还是n+1

类似的事情在这里发生。 bash处理完命令后,就会看到存在输出重定向,因此它将打开并截断要写入的文件,一旦准备好重定向,它将启动您的脚本,其输入是现在为空的文件,因此没有其他内容写在那里。

简而言之:不要写入您正在读取的文件。通常的技术是写入一个临时文件,并在完成后替换原始文件(command input>temp; rm input; mv temp input)。其他技巧还包括使用某些软件,这些软件明确允许进行sed -i中的内联修改(如sponge)或实用程序如moreutils

您的代码可能是:

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