2

有一个包含一些列的 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

我得到整行没有“;” 而不是作为 arr[0] 的 CustomerID 接下来我不知道如何将行首的数字写回文件。任何人都可以帮助我吗?

4

2 回答 2

2

尝试:

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要用于下一行的变量,然后打印该行

输出:

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
于 2013-10-30T10:43:15.493 回答
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"
于 2013-10-30T10:50:19.840 回答