Условно удалить строки, содержащие менее 4 символов

ag (серебряный поисковик)обеспечивает очень быстрый поиск в файлах, а также имеет возможность поиска по имени файла:

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find. -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

Таким образом, в моем случае это > 30 раз быстрее, если файл не игнорируется ag.

0
06.11.2020, 01:05
2 ответа

Сgrep:

< file.in grep -E '^[#!]|.{4}' > file.out

То есть выберите строки, которые либо начинаются с #или !, либо содержат последовательность из 4 символов.

Или сawk:

< file.in awk '/^[#!]/ || length >= 4' > file.out

Или сsed:

< file.in sed -e '/^[#!]/b' -e '/.\{4\}/!d' > file.out
7
18.03.2021, 22:52

Вы можете попробовать что-то подобное, код не тестировался:

while read line;
do
var=$(echo $line | awk '{ print length }')
if [ $var -le 4 ]; then
echo $line >> tmp.file
fi
done < your.file

Это 2 шага, при чтении он записывает строки длиной менее 4 символов в tmp.file. С помощью comm -23 your.file tmp.fileвы сравниваете оба файла, подавляете общие строки, а > you.new.fileявляется окончательной сохраненной версией

.
-6
18.03.2021, 22:52

Теги

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