使用shell脚本查找CSV文件中列的最小和最大长度
我有几个包含多列的CSV文件,我想获得同一CSV文件中每个列的最大长度、最小长度和差异(max-min)。例如: 文件: 预期产出:使用shell脚本查找CSV文件中列的最小和最大长度,shell,csv,awk,sh,gawk,Shell,Csv,Awk,Sh,Gawk,我有几个包含多列的CSV文件,我想获得同一CSV文件中每个列的最大长度、最小长度和差异(max-min)。例如: 文件: 预期产出: abc 1234 4 bcd 23644 534 c 3232 6 Max Length 3 5 3 Min Length 1 4 1 Diff 2 1 2 awk -F, ' { for (i=1;i<=NF;i++)l[i]=((x=length($i))>l[i]?x:l[i])} END {for(i=1;i
abc 1234 4
bcd 23644 534
c 3232 6
Max Length 3 5 3
Min Length 1 4 1
Diff 2 1 2
awk -F, '
{ for (i=1;i<=NF;i++)l[i]=((x=length($i))>l[i]?x:l[i])}
END {for(i=1;i<=NF;i++) print "Column"i":",l[i]} '
以下用于计算最大列长度的脚本正在生成预期输出:
abc 1234 4
bcd 23644 534
c 3232 6
Max Length 3 5 3
Min Length 1 4 1
Diff 2 1 2
awk -F, '
{ for (i=1;i<=NF;i++)l[i]=((x=length($i))>l[i]?x:l[i])}
END {for(i=1;i<=NF;i++) print "Column"i":",l[i]} '
awk-F,'
{for(i=1;il[i]?x:l[i])}
END{for(i=1;i您只需要根据文件的第一行设置最小和最大数组的起始值:
awk '
NR==1 {for (i=1; i<=NF; i++) maxlen[i] = minlen[i] = length($i)}
{
for (i=1; i<=NF; i++) {
len = length($i)
if (len > maxlen[i]) maxlen[i] = len
if (len < minlen[i]) minlen[i] = len
}
}
END {
printf "Max Length"
for (i=1; i<=NF; i++) printf " %d", maxlen[i]
print ""
printf "Min Length"
for (i=1; i<=NF; i++) printf " %d", minlen[i]
print ""
printf "Diff"
for (i=1; i<=NF; i++) printf " %d", maxlen[i]-minlen[i]
print ""
}
' file
awk'
NR==1{for(i=1;ii)在第二个脚本中,使用BEGIN表明您需要了解BEGIN的功能。此外,您谈到CSV文件,awk脚本使用逗号作为分隔符,但示例中没有逗号。因为“CSV”是一个高度模糊的名称,如果您澄清您的意思,可能会有所帮助。特别是,是否有任何字段具有嵌入的字段分隔符?如果CSV文件中的字段中的值看起来像“abc”
(即,带有外引号),则该值应计为长度3还是5?那么的长度如何“
?切勿将l
(字母el
)用作变量名,因为它看起来太像1
(数字1
),在某些字体中无法区分,因此会混淆脚本。例如,maxl[i]=l
看起来像是在设置maxl[i]
到1
。可以使用cur
匹配max
和min
?