Максимальная запятая в одной строке, используя скрипт bash - PullRequest
3 голосов
/ 03 апреля 2012

У меня есть \n законченный текст:

Она ходит, в красоте, как ночь
Безоблачного неба и звездного неба
И все, что лучше, темных и светлых
Встретимся в ее аспекте, и ее глаза

И я хочу найти, какая строка имеет максимальное число , и вывести эту строку тоже. Например, приведенный выше текст должен выглядеть как

Она ходит, в красоте, как ночь

Так как у него 2 (максимум среди всех строк) запятых.

Я пробовал:

cat p.txt | grep ','

но не знаю, куда идти.

Ответы [ 4 ]

6 голосов
/ 03 апреля 2012

Вы можете использовать awk:

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

Обратите внимание, что если max не уникально, выбирается первое с максимальным количеством.

3 голосов
/ 03 апреля 2012

попробуйте это

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

Вывод

She walks, in beauty, like the night

Awk работает с 'Полями', -F говорит использовать ',' для разделения полей.(Значением по умолчанию для F является соседний пробел, (пробел и табуляции))

NF означает количество полей (в текущей записи).Таким образом, мы используем логику, чтобы найти запись с максимальным количеством полей, захватывая значение строки '$ 0', и в конце мы выводим строку с большинством полей.

Этоне определено, что произойдет, если 2 строки имеют одинаковое максимальное количество запятых; -)

Надеюсь, это поможет.

0 голосов
/ 03 апреля 2012

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}"
0 голосов
/ 03 апреля 2012

Решение 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 ~]$ 
...