Как удалить строки, похожие на другую, но короче?

Используйте numfmt --from=...для преобразования размеров файлов в байты, тогда вы сможете легко суммировать их:

curl -s $URL | html2text -width $COLUMNS \
| awk '$3~/\.mp4/{print $6}' \
| LC_ALL=C numfmt --from=iec \
| paste -sd+ | bc

58044134197
  • Добавьте | numfmt --to=iec, чтобы снова получить удобочитаемые размеры, а также, если хотите, --format '%.1f', чтобы получить десятичные разряды.
  • Используйте --from=siдля 1000 -размеров файлов.
  • В зависимости от ваших локальных настроек вы можете опустить LC_ALL=C, но я получаю сообщение об ошибке с 1.1G.
1
22.01.2021, 09:25
2 ответа

Использование 2x awk, sortиcut:

awk '{print length($2), NR, $0}' file |
  sort -k1,1nr |
  awk '
  {
    for(i=1;i<=cnt;i++){
      split(lines[i], tmp)
      if ($3 == tmp[3] && $1 < tmp[1] && index(tmp[4], $4)) next
    }
    lines[++cnt]=$0
  }
  END{
    for(i=1;i<=cnt;i++) print lines[i]
  }' |
  sort -k2,2n |
  cut -d' ' -f3-
  1. awk:Печать длины поля последовательности, номера строки и исходной строки

  2. sort:Обратная сортировка по длине поля последовательности, вывод такой:

    6 3 Espece_B GACCTT
    6 4 Espece_B ATCTGG
    5 5 Espece_C ACCTG
    4 1 Espece_A ACGT
    4 2 Espece_B ACCT
    4 6 Espece_D ACCT
    
  3. awk:Добавить в массив записи, которые не следует удалять lines. Для каждой записи цикл по уже добавленным элементам массива и проверка

    • если название вида совпадает($3 == tmp[3])
    • если последовательность короче($1 < tmp[1])
    • если последовательность является подстрокой(index(tmp[4], $4))

    Если все три условия верны, то перейти к записи next, иначе добавить в массив текущую запись. Выведите элементы массива в блоке end.

  4. sort:По исходному номеру строки

  5. cut:Удалить первые два поля

1
18.03.2021, 22:35

Это можно сделать с помощью короткой программы на Python, которую легко запустить в Bash.

#!/usr/bin/env python3
import sys
last_line = ""
for line in sys.stdin:
    if len(line) > len(last_line) or line[0:-1] != last_line[0:len(line)-1]:
        print(line, end='')
    last_line = line

Использование:

  • скопируйте приведенный выше код в файл с именемdel_shorter.py
  • сделать файл исполняемым:chmod +x del_shorter.py
  • запустите его с файлом, отсортированным в обратном порядке -в качестве входных данных, и снова отсортируйте выходные данные:
cat your_file.txt |sort -r |./del_short_matches.py |sort
1
18.03.2021, 22:35

Теги

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