打印特定行

时间:2013-10-24 07:16:59

标签: python grep

我的数据格式如下:

     1     "hi"
     2     "hello"
     3 "abc"
     4-"def"
     5(-hjs
     6     "there" 
     abc"    "def"
     7     "there1"

标签分隔1和“hi”。另一个标签分隔2和“你好”,而在3和“abc”之间没有这样的分离。类似地,对于4-“def”和5(-hjs。

我想删除标签不分隔数字和字符串的所有行。我希望我的输出具有以下形式。

     1     "hi"
     2     "hello"
     6     "there" 
     7     "there1"

我试图只使用grep'^ * [0-9]'存储那些包含数字的行(尽管它删除了abc,但它无法删除其余的)。但是,它会删除所有行。是否可以使用linux命令/ python删除指定的行。

我尝试通过检查是否存在拆分而在python中执行..但是拆分对于“abc”def“

形式的模式不起作用

我正在使用制表符('\ t')进行制表......那么我该如何合并呢...也可以请你解释一下

4 个答案:

答案 0 :(得分:2)

使用regular expressions

s = """
1     "hi"
2     "hello"
3 "abc"
4-"def"
5(-hjs
6     "there" 
abc"    "def"
7     "there1"
"""

import re

for line in s.splitlines():
    if not line:
        continue # skip empty lines
    if re.match(r'^\d\t\S+', line):
        print line

输出:

>>> 
1     "hi"
2     "hello"
6     "there" 
7     "there1"

说明:

正则表达式模式尝试匹配该行。

  • ^:这意味着字符串(或行)的开头
  • \d:这意味着匹配单个数字字符
  • \t:这意味着匹配制表符。
  • \S+:这意味着至少匹配一次非空格字符

您可以将正则表达式更改为:r'^\d\s{4,}\S+'

添加\s{4,}表示空白字符至少4次(这是大多数表格的默认字符长度)。

您还可以将它们组合成一个正则表达式,该表达式可以处理将标签转换为空格的情况:r'^\d(\t|\s{4,})\S+'这会添加一个组,该组将查找\t\s{4,}。它涵盖了你所有的基地。

答案 1 :(得分:2)

如果您的版本支持perl正则表达式语法,则可以使用它:

grep -P '^\d+\t+\S+' infile

它匹配行(^)的开头,一个数字(\d+)后跟一个或多个标签(\t+),后跟一个非空格字符({{ 1}})。

它产生:

\S+

答案 2 :(得分:1)

尝试

grep '^[0-9]*\s\{4\}'

(假设您使用4个空格进行制表,就像您粘贴的示例一样。)

答案 3 :(得分:1)

使用awk

awk '/^[0-9]+\t/' file

仅打印以一个或多个号码[0-9]+开头的行,后跟一个标签\t