Bash 如何使用awk打印长度最大的数据?

Bash 如何使用awk打印长度最大的数据?,bash,awk,gawk,Bash,Awk,Gawk,我有以下意见: 1 happy,t,c,d 2 t,c 3 e,fgh,k 4 yk,j,f 5 leti,j,f,g 我想打印以逗号作为分隔符的最大项目的长度,这将产生: 1 5,1,1,1 2 1,1 3 1,3,1 4 2,1,1 5 4,1,1,1 然后我想为第二列选择最大值,最终创建: 1 5 2 1 3 3 4 2 5 4 我在awk里怎么做 1对于我尝试的第一个任务: 唯一的问题是我不能正确地使用-v选项来只读该列。所以,我将所有数据都放在一列中,并从co

我有以下意见:

1 happy,t,c,d
2 t,c
3 e,fgh,k
4 yk,j,f
5 leti,j,f,g
我想打印以逗号作为分隔符的最大项目的长度,这将产生:

 1 5,1,1,1
 2 1,1
 3 1,3,1
 4 2,1,1
 5 4,1,1,1
然后我想为第二列选择最大值,最终创建:

 1 5
 2 1
 3 3
 4 2
 5 4
我在awk里怎么做

1对于我尝试的第一个任务: 唯一的问题是我不能正确地使用-v选项来只读该列。所以,我将所有数据都放在一列中,并从column1的长度和column1与column2之间的空格中添加值

2要选择最大值,我执行以下操作: 而不是:

5
1
3
2
4

最后,我想一次性合并这两个过程。有任何改进建议吗?

我们从以下数据文件开始:

$ cat data
1 happy,t,c,d
2 t,c
3 e,fgh,k
4 yk,j,f
5 leti,j,f,g
对于第一项任务:

$ awk '{n=split($2,a,/,/); printf "%2s %s",$1,length(a[1]); for(i=2; i<=n; i++) printf ",%s",length(a[i]); print""}' data
 1 5,1,1,1
 2 1,1
 3 1,3,1
 4 2,1,1
 5 4,1,1,1
对于第二项任务:

$ awk '{n=split($2,a,/,/); max=length(a[1]); for(i=2; i<=n; i++) if (length(a[i])>max)max=length(a[i]); print $1,max}' data
1 5
2 1
3 3
4 2
5 4
工作原理 对于第二项任务:

$ awk '{n=split($2,a,/,/); max=length(a[1]); for(i=2; i<=n; i++) if (length(a[i])>max)max=length(a[i]); print $1,max}' data
1 5
2 1
3 3
4 2
5 4
n=分割$2,a,//

我们将字段2的内容拆分为数组

最大值=长度[1]

我们将数组a的第一个元素的长度指定给awk变量max

fori=2;imaxmax=lengtha[i]

如果数组a的任何后续元素大于max,则更新`max

最多打印1美元

我们打印第一个字段和max的值

对于第一种情况:

awk -F'[, ]' -v OFS="," '{printf "%s",$1;for (i=2;i<=NF;i++) printf "%s%s",(i==2?" ":OFS),length($i)}{print ""}'
1 5,1,1,1
2 1,1
3 1,3,1
4 2,1,1
5 4,1,1,1
较短的备选方案:

awk -F'[, ]' -v OFS="," '{printf "%s ",$1;for (i=2;i<=NF;i++) printf "%s%s",length($i),(i==NF?ORS:OFS)}'
虽然在awk中打印打印数据并通过在末尾打印新行来更改行,但printf不会自行更改行


附言:感谢埃德·莫顿的宝贵评论。

试图把这句话写下来:

gawk -F'[ ,]' '{m=0;for(i=2;i<=NF;i++){l=length($i);if(l>m)m=l}print$1,m}'

perl -MList::Util=max -F'\s+|,' -lne'$,=" ";print shift(@F),max map{length}@F'
perl -MList::Util=max -F'\s+|,' -lne'print"@{[shift(@F),max map{length}@F]}"'
perl -MList::Util=max -F'\s+|,' -lpe'$_="@{[shift(@F),max map{length}@F]}"'    

ruby -F'[ ,]' -lape'$_="#{$F[0]} #{$F[1..-1].map{|e|e.size}.max}"'

max=lengtha[i]:@pesatheoops!非常感谢。答案更新为i for 1。关于这个awk答案没有什么特别的地方,它在任何awk中都会起作用,你不应该使用字母l作为变量名,因为它看起来太像数字1了,所以会混淆你的代码。好吧,这是一个非常模糊的问题。我原以为并不是所有的awk都支持FSE中的正则表达式只有旧的、坏的awk/bin/awk在Solaris上不支持FS中的正则表达式,但它也不支持许多其他东西,通常是坏的,而且永远不能使用,所以不值得一提。。。除了每个脚本上的旧的、坏的awk之外,假设没有人使用它。有关its的一些问题,请参阅。顺便说一句!awk-F'[,]'{m=0;whileNF->2{l=length$NF;ifl>mm=l}打印$1,m}文件。警告-这在我所知道的任何awk中都会起作用,但是减少NF的效果在技术上是根据POSIX未定义的行为。这是一个更大的问题,当人们依赖NF-删除记录的最后一个字段作为YMMV时,这取决于您使用的awk,但这里的情况并非如此。
awk -F'[, ]' -v OFS="," '{m=length($2);for (i=3;i<=NF;i++) if (length($i) > m) m=length($i)}{print $1,m}' file
1,5
2,1
3,3
4,2
5,4
awk -F'[, ]' -v OFS="," '{printf "%s",$1;for (i=2;i<=NF;i++) printf "%s%s",(i==2?" ":OFS),length($i)}{print ""}'
1 5,1,1,1
2 1,1
3 1,3,1
4 2,1,1
5 4,1,1,1
awk -F'[, ]' -v OFS="," '{printf "%s ",$1;for (i=2;i<=NF;i++) printf "%s%s",length($i),(i==NF?ORS:OFS)}'
gawk -F'[ ,]' '{m=0;for(i=2;i<=NF;i++){l=length($i);if(l>m)m=l}print$1,m}'

perl -MList::Util=max -F'\s+|,' -lne'$,=" ";print shift(@F),max map{length}@F'
perl -MList::Util=max -F'\s+|,' -lne'print"@{[shift(@F),max map{length}@F]}"'
perl -MList::Util=max -F'\s+|,' -lpe'$_="@{[shift(@F),max map{length}@F]}"'    

ruby -F'[ ,]' -lape'$_="#{$F[0]} #{$F[1..-1].map{|e|e.size}.max}"'