Используйте 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
. Использование 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-
awk
:Печать длины поля последовательности, номера строки и исходной строки
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
awk
:Добавить в массив записи, которые не следует удалять lines
. Для каждой записи цикл по уже добавленным элементам массива и проверка
$3 == tmp[3]
)$1 < tmp[1]
)index(tmp[4], $4)
)Если все три условия верны, то перейти к записи next
, иначе добавить в массив текущую запись. Выведите элементы массива в блоке end
.
sort
:По исходному номеру строки
cut
:Удалить первые два поля
Это можно сделать с помощью короткой программы на 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