热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

正则表达式字符恰好出现x次-regexcharacterappearsexactlyxtimes

ImworkinginbashandIhavealargefileinwhichIwanttoremoveallthelinesthatdonotmatc

I'm working in bash and I have a large file in which I want to remove all the lines that do not match a certain regex, probably using $ grep -e "" > output.txt

我在bash工作,我有一个大文件,我想删除所有与某个正则表达式不匹配的行,可能使用$ grep -e“ > output.txt

What I want to keep is any line that contain exactly x times a specified character, for example in the binary sequence

我想要保留的是任何包含指定字符x次的行,例如二进制序列

0000, 0001, 0010, 0011, 0100, 0101, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111

0000,0001,0010,0011,0100,0101,0111,1000,1001,1010,1011,1100,1101,1110,1111

I would like to keep only those who have 2 1, leaving me with

我想只保留那些有2 1的人,让我留下

0011, 0101, 0110, 1001, 1010, 1100

0011,0101,0110,1001,11010,1100

I would then use a bash variable to vary the amount I need (always exactly half of the length, working with strings of the same length) I'm litterally looking for lines that are half 0 and half 1

然后我会使用一个bash变量来改变我需要的数量(总是正好是长度的一半,使用相同长度的字符串)我正在寻找半0和半1的行

I have this right now. It's not using regex. It works, but is very slow:

我现在有这个。它不使用正则表达式。它有效,但速度很慢:

($1 is the length of every string, $d is just a directory)

($ 1是每个字符串的长度,$ d只是一个目录)

sed -e 's/\(.\)/\1 /g' <$d/input.txt > $d/spaces.txt
awk '{c=0;for(i=1;i<=NF;++i){c+=$i};print c}' $d/spaces.txt > $d/sums.txt
grep -n "$(($1/2))" $d/sums.txt | cut -f1 -d: > $d/linenums.txt
for i in $(cat $d/linenums.txt)
do
    sed "${i}q;d" $d/input.txt 
done > $d/valids.txt

In case you wonder this puts spaces in between every digit turning 1010 into 1 0 1 0, then it adds the values together, saves the results in sums.txt, grep for length/2 and save only the line numbers in linenums.txt, then it reads linenums.txt and outputs the corresponding line from input.txt to output.txt

如果你想知道这会在每个数字之间放置空格1010变成1 0 1 0,那么它将值加在一起,将结果保存在sums.txt中,grep表示长度/ 2并且只保存linenums.txt中的行号,然后它读取linenums.txt并从input.txt输出相应的行到output.txt

I need something quicker, the for loop is what's taking way too long

我需要更快的东西,for循环是太长时间了

Thanks for your time and for sharing your knowledge with me.

感谢您的时间,并与我分享您的知识。

1 个解决方案

#1


2  

you can definitely make this faster.

你绝对可以加快速度。

here is a grep regex example to match any lines with exactly two occurrences of 1:

这是一个grep正则表达式示例,以匹配任何行恰好两次出现1:

grep '^\([^1]*1[^1]*\)\{2\}$' input.txt

you can generalize this to match exactly n occurrences of c:

你可以推广这个以恰好匹配n次出现的c:

grep "^\([^$c]*$c[^$c]*\)\{$n\}\$" input.txt

you also mentioned wanting to match lines that are half 0s, half 1s. since you stipulated that all the lines are of the same length, you can consider only the first line, and use awk (or wc) to get line length and choose n:

你还提到想要匹配半0,半1的线。既然你规定所有的行都是相同的长度,你可以只考虑第一行,并使用awk(或wc)来获取行长并选择n:

n=`head -n1 input.txt | awk '{printf "%d\n",length($0)/2}'`
c=1
grep "^\([^$c]*$c[^$c]*\)\{$n\}\$" input.txt

推荐阅读
  • ZABBIX 3.0 配置监控NGINX性能【OK】
    1.在agent端查看配置:nginx-V查看编辑时是否加入状态监控模块:--with-http_stub_status_module--with-http_gzip_stat ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • MySQL5.6.40在CentOS764下安装过程 ... [详细]
  • 本篇文章为大家展示了input语句的作用有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。HTML标签 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • 基础数据范例ECMAScript中有5种简朴数据范例(也称基础数据范例):Undefined,Null,Boolean,Number和String。另有一种庞杂数据范例(援用型)O ... [详细]
  • 动手写一个OpenVPN的wrapper来优化OpenVPN性能
    动手写一个OpenVPN的wrapper来优化OpenVPN性能 ... [详细]
author-avatar
刻骨铭心2502914183_610
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有