0

我有以下格式的数据:

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

制表符分隔 1 和“hi”。另一个选项卡将 2 和“hello”分隔开来,而在 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

4 回答 4

2

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

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

它从行首 ( ) 开始匹配^一个数字 ( \d+),后跟一个或多个制表符 ( \t+),后跟一个非空格字符 ( \S+)。

它产生:

1   "hi"
2   "hello"
6   "there" 
7   "there1"
于 2013-10-24T07:39:10.423 回答
2

使用正则表达式

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+'

这添加了 a \s{4,},这意味着一个空白字符至少 4 次(这是大多数表格的默认字符长度)。

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

于 2013-10-24T07:31:31.947 回答
1

使用awk

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

仅打印以一个或多个数字[0-9]+开头后跟一个制表符的行\t

于 2013-10-24T08:11:32.250 回答
1

尝试

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

(前提是您使用 4 个空格进行制表,如您粘贴的示例中所示)。

于 2013-10-24T07:31:28.877 回答