有一个带有一些列的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访问Array Index。
这是我的剧本:
#!/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
我得到整条线没有“;”而不是作为arr [0]的CustomerID我不知道如何将行开头的数字写回文件。有人可以帮帮我吗?
答案 0 :(得分:2)
尝试:
awk -v id=12345 -F ';' '$1==""{$1=id;} {id=$1; print}' OFS=';' file
;
,可让您以$1
,$2
,$3
等方式访问每个字段。-v id=12345
是一个命令行参数,您传递给awk以便在第一个字段为空时使用$1=""
是检查第一个字段是否为空的条件$1=id
正在设置$1
以传递变量id
{id=$1; print}
设置用于下一行的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
答案 1 :(得分:1)
纯粹的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"