Скрипт Bash для прохождения всех строк файла по одной и подсчета, сколько раз новая строка отличается от предыдущей строки - PullRequest
0 голосов
/ 03 июня 2019

Я ищу скрипт / команду для чтения файла с 200000 строками (каждая строка имеет числа с пробелами между ними), и когда новая строка не совпадает с предыдущей строкой, равной 1, и продолжаю до концафайла.

Я искал на форуме и подобные вопросы, но я не мог найти то, что может помочь мне в этом.

Пример ввода:

2 3 4 5 
3 100 105 40
2 1005 1002
2 1005 1002
4 100  105 
0 
3 100 105 40
3 100 105 40

Вывод должен быть:

5

Есть предложения по этому поводу?

Ответы [ 3 ]

3 голосов
/ 03 июня 2019

Я бы использовал uniq, удалив все дублирующиеся последовательные строки, затем wc для подсчета строк:

uniq input_file | wc -l

Вы можете попробовать здесь !

0 голосов
/ 03 июня 2019

Вы описываете uniq | wc -l, но это даст 6 для вашего образца ввода.Поэтому, может быть, вы хотите sort -u | wc -l.

$ sort -u test.txt | wc -l
5

Подробнее

$ sort -u test.txt
0 
2 1005 1002
2 3 4 5 
3 100 105 40
4 100  105 

$ uniq test.txt
2 3 4 5 
3 100 105 40
2 1005 1002
4 100  105 
0 
3 100 105 40

(дополнительная пустая строка является частью моего приглашения)

0 голосов
/ 03 июня 2019

Запрошена вся реализация bash буквальной логики:

cnt=0
last=''
while read line
do case "$line" in
   "$last") continue ;;
   *) last="$line"
      (( cnt++ ))    ;;
   esac
done < in
echo "Total: $cnt"

Лучшая реализация в awk:

$: awk 'BEGIN      { last=""; cnt=0; }
        $0 != last { last=$0; cnt++; }
        END        { print cnt;      }' in
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...