поиск всех неуникальных строк в файле

Фрагмент 2 ближе всего. dialog --gaugeопционально будет искать магический маркер XXXво входных данных, а затем считывать новый процент из следующей строки и новое приглашение из строк после нее до нового маркера.

Таким образом, вы должны получить то, что хотите,:

HandBrakeCLI --preset "Normal" -i "$f" -o "$DEST_FULL_FILE" |
stdbuf -oL tr -s '\r' '\n' |
while read -r str
do
    REMAINING=$(echo "$str" | grep -oP "(?<=ETA )\d\dh\d\dm\d\ds(?=\))")
    PROGRESS=$(echo "$str" | grep -oP "(?<=, )\d+(?=.\d\d)")
    echo -e "XXX\n$PROGRESS\n$DIALOG_MSG Time remaining: $REMAINING\nXXX"
done | 
dialog --gauge "$DIALOG_MSG Time remaining: " 10 70;
1
08.11.2019, 00:18
3 ответа

Вам нужна строчная -опция d версии GNU.

# printf "a\na\na\nb\nb\nc\n" | uniq -d
a
b
1
27.01.2020, 23:29

С помощью GNU или ast -открыть реализациюuniq:

uniq -D -u < input

(-Dсам по себе не является -стандартным ), хотя обратите внимание, что он удаляет последний дубликат, а не первый (, что имеет значение, если вы также используете -i, -wили -f)

.

Переносимо, вы всегда можете использоватьawk:

awk 'NR > 1 && $0 "" == previous ""; {previous = $0}' < input

(объединение с ""для принудительного сравнения строк, даже если операнды выглядят как числа)

Для сравнения только первых 9 символов (обратите внимание, что -wтакже является расширением GNU, и (в настоящее время )работает с байтами, а не с символами (, несмотря на то, что написано в его документе)):

awk '{current = substr($0, 1, 9)}
     NR > 1 && current == previous
     {previous = current}' < input

(в этом случае конкатенация ""не требуется, так как substr()возвращает строку ).

В локали UTF -8, на выходе

printf '%s\n' StéphaneChazelas StéphaneUNIX StéphaneUnix

Это дает StéphaneUnix, как и ожидалось, в то время какuniq -w9 -D -u(с GNUuniq)дает StéphaneChazelasи StéphaneUNIX, поскольку Stéphaneсоставляет 8 символов, но 9 байтов в UTF -8, в то время как ast -open uniqдает StéphaneUNIX только(awkпропускает первое вхождение, uniqудаляет последнее вхождение ).

С awk,вы также можете сообщить обо всех повторяющихся строках, даже если они не соседствуют с:

 awk 'seen[$0]++' < input

(обратите внимание, что он сохраняет все уникальные строки в памяти в хэш-таблице, хотя ).

Или учитывать только первые 9 символов:

 awk 'seen[substr($0, 1, 9)]++' < input
2
27.01.2020, 23:29

Решение состоит в том, чтобы использовать -cuniq, а после удалить то, что вы хотите

e444$ (   echo a ; echo a ; echo b ; echo d ; echo d ; echo e )  | uniq -c
  2 a
  1 b
  2 d
  1 e 

aи dдублируются, а bи eдублируются

e444$ (   echo a ; echo a ; echo b ; echo d ; echo d ; echo e )  | uniq -c  \             
              | sed -E '/^ *1.$/d;s/^ *[0-9]+ //'

объяснение выражения sed:

/^ *1.$/dудалит все уникальные строки

s/^ *[0-9]+ //удалит счетчик

0
27.01.2020, 23:29

Теги

Похожие вопросы