bash中csv各列的匹配长度

Matching length of each column of csv in bash

data.dat:
001,Sam,SA
002,Tom,SA
003,Lara,WI
004,Mhd,Pak

lookup.dat:
p_id,3
p_name,3
p_team,2

我如何编写 shell 脚本来通过检查查找文件中各列的相应长度来验证 data.dat 中每个字段的长度。

如果错误(长度不匹配)如 p_id 003 & 004 显示记录号和列名。

你可以试试这个:

source <(sed 's/,/=/' lookup.dat)
while IFS=',' read -r id name team; do
  (( i++ ))
  line="$id $name $team, line $i : different size"
  [ ${#id} == $p_id ] || echo "$line id"
  [ ${#name} == $p_name ] || echo "$line name"
  [ ${#team} == $p_team ] || echo "$line team"
done < data.dat

输出:

003 Lara WI, line 3 : different size name
004 Mhd Pak, line 4 : different size team

循环将每一行的字段大小与 lookup.dat 中引用的大小进行比较。

如果大小不同,该字段将打印行号。

更新:

按照建议,我在读取命令中添加了 -r 以防止读取数据时反斜杠解释。

为了更好的可读性,变量名已经过硬编码。如果数字 and/or 类型 variables/datas 可以更改,请选择 Ed Morton 答案。

对您的输入数据代表什么以及您正在尝试做什么做出一大堆假设,这可能就是您想要的:

awk -F, '
NR==FNR { name[NR]=; reqLength[NR]=; next }
{ for (i=1;i<=NF;i++) if (length($i) != reqLength[i]) print "Ruh-roh:", FNR, name[i] }
' lookup.dat data.dat
Ruh-roh: 3 p_name
Ruh-roh: 4 p_team