如何用bash脚本replacestring并写回结果

有一些列的CSV文件,第一列是一个5位数的客户编号,其他列用“;”分隔。

这里是一个例子:

12345;some;other;cols;comes;here ;some;other;cols;comes;here ;some;other;cols;comes;here 67890;some;other;cols;comes;here 34567;some;other;cols;comes;here ;some;other;cols;comes;here ;some;other;cols;comes;here ;some;other;cols;comes;here ;some;other;cols;comes;here 24315;some;other;cols;comes;here 

如果第一列是空的,比我需要设置最后一个给定的客户ID。 结果应该如下所示:

 12345;some;other;cols;comes;here 12345;some;other;cols;comes;here 12345;some;other;cols;comes;here 67890;some;other;cols;comes;here 34567;some;other;cols;comes;here 34567;some;other;cols;comes;here 34567;some;other;cols;comes;here 34567;some;other;cols;comes;here 34567;some;other;cols;comes;here 24315;some;other;cols;comes;here 

现在我用bash脚本逐行读取文件,并想检查行是否以数字开始。 如果是,则按“;”分隔线 并用array [0](第一个值)设置customerID。 接下来,我检查一下这行是不是以一个数字开始,并且想要在行的开头写上五位数字。 但是我不能用客户ID访问数组索引。

这是我的脚本:

 #!/bin/bash while read line do row=$line if echo $row |grep "^[0-9].*$" > /dev/null; then arr=$(echo $row | tr ";" "\n") echo ${arr[0]}; fi done < $1 

我得到整个线路没有“;” 而不是客户ID作为arr [0]接下来我不知道如何写在行开头的数字回到文件。 任何人都可以帮助我?

尝试:

 awk -v id=12345 -F ';' '$1==""{$1=id;} {id=$1; print}' OFS=';' file 
  • awk使用字段分隔符; 这使您访问每个单独的领域为$1$2$3
  • -v id=12345是一个命令行参数,当第一个字段为空时,它将传递给awk使用
  • $1=""是检查第一个字段是否为空的条件
  • $1=id设置$1来传递变量id
  • {id=$1; print} {id=$1; print}设置要用于下一行的id变量,然后打印该行

OUTPUT:

 12345;some;other;cols;comes;here 12345;some;other;cols;comes;here 12345;some;other;cols;comes;here 67890;some;other;cols;comes;here 34567;some;other;cols;comes;here 34567;some;other;cols;comes;here 34567;some;other;cols;comes;here 34567;some;other;cols;comes;here 34567;some;other;cols;comes;here 24315;some;other;cols;comes;here 

纯粹的bash解决方案:

 #!/bin/bash # Globally set IFS, if you don't like it, wrap it all in a subshell. IFS=';' lastID=-1 while read -a row; do [[ -z ${row[0]} ]] && row[0]=$lastID lastID=${row[0]} # Abusing IFS echo "${row[*]}" done < "$1"