извлечение последних n процентов выходного файла из команды zcat - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь извлечь последние 2 процента файла, выводимого командой zcat. Я пробовал что-то делать

numlines=$(zcat file.tar.gz | wc -l)
zcat file.tar.gz | tail -n + $numlines*(98/100)

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

РЕДАКТИРОВАТЬ: вывод zcat file.tar.gz | tar -xO | dd 2>&1 | tail -n 1 - это

16942224047 байт (17 ГБ, 16 ГБ) скопировано, 109,154 с, 155 МБ / с

Любая помощь будет очень оценен.

Ответы [ 2 ]

2 голосов
/ 23 июня 2020

Следующая awk-программа сохранит в памяти только n % вашего файла. Процент берется по полу, то есть, если мы n % файла представляет 134,56 строки, он напечатает 134 строки

awk -v n=2 '{a[FNR]=$0; min=FNR-int(FNR*n/100)}
            {i=min; while(i in a) delete a[i--]}
            END{for(i=min+1;i<=FNR;++i) print a[i]}' - < <(zcat file)

, вы можете проверить это при замене zcat file с seq 100

2 голосов
/ 19 июня 2020

Прочитать содержимое переменной. Я предполагаю, что оперативной памяти достаточно.

content=$(zcat file.tar.gz| tar -xO)
lines=$(wc -l <<<"$content")
ninetyeight=$((100-$lines/100*98))
tail -n $ninetyeight

Это работает, только если файл содержит не менее 100 строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...