匹配bash中每列csv的长度

时间:2016-02-29 17:42:12

标签: bash shell for-loop awk cut

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 显示记录号和列名。

2 个答案:

答案 0 :(得分:2)

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

awk -F, '
NR==FNR { name[NR]=$1; reqLength[NR]=$2; 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

答案 1 :(得分:1)

你可以试试这个:

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以防止在读取数据时进行反斜杠解释。

变量名称已经过硬编码以提高可读性。如果变量/数据的数量和/或类型可以改变,则更喜欢Ed Morton答案。