使用bash脚本将max comma放在一行上

时间:2012-04-03 03:57:52

标签: linux bash unix grep

我有一些\n结束文字:

  

她走路,美丽,就像夜晚一样   无云的气候和星空的天空   黑暗和明亮的一切都是最好的   在她的方面和她的眼睛相遇

我想找到哪一行的最大数量为,并打印该行。 例如,上面的文本应该为

  

她走路,美丽,像夜晚一样

因为它有2个(所有行中最多)逗号。

我试过了:

cat p.txt | grep ','

但不知道现在去哪里。

4 个答案:

答案 0 :(得分:6)

您可以使用awk

awk -F, -vmax=0 ' NF > max { max_line = $0; max = NF; } END { print max_line; }' < poem.txt

请注意,如果max不是唯一的,那么选择第一个具有最大计数。

答案 1 :(得分:3)

试试这个

awk '-F,' '{if (NF > maxFlds) {maxFlds=NF; maxRec=$0}} ; END {print maxRec}' poem

输出

She walks, in beauty, like the night

Awk使用'Fields',-F表示使用','来分隔字段。 (F的默认值是相邻的空格,(空格和制表符))

NF表示字段数(在当前记录中)。所以我们使用逻辑来查找具有最大字段数的记录,捕获行'$ 0'的值,在END,我们打印出具有最多字段的行。

未定义如果2行具有相同的最大逗号数,将会发生什么; - )

我希望这会有所帮助。

答案 2 :(得分:0)

FatalError的基于FS的解决方案很不错。我能想到的另一种方法是从行中删除非逗号字符,然后计算它的长度:

[ghoti@pc ~]$ awk '{t=$0; gsub(/[^,]/,""); print length($0), t;}' poem 
2 She walks, in beauty, like the night
1 Of cloudless climes, and starry skies
1 And all that's best, of dark and bright
1 Meet in her aspect, and her eyes
[ghoti@pc ~]$ 

现在我们只需要跟踪它:

[ghoti@pc ~]$ awk '{t=$0;gsub(/[^,]/,"");} length($0)>max{max=length($0);line=t} END{print line;}' poem 
She walks, in beauty, like the night
[ghoti@pc ~]$ 

答案 3 :(得分:0)

Pure Bash:

declare ln=0                            # actual line number
declare maxcomma=0                      # max number of commas seen
declare maxline=''                      # corresponding line
while read line ; do
  commas="${line//[^,]/}"               # remove all non-commas
  if [ ${#commas} -gt $maxcomma ] ; then
    maxcomma=${#commas}
    maxline="$line"
  fi
  ((ln++))
done < "poem.txt"

echo "${maxline}"