【问题标题】:read non-formatted column value读取非格式化列值
【发布时间】:2018-01-18 06:05:52
【问题描述】:

我正在尝试读取 "Description 4" 列的所有值。如果所有值都在同一行并且没有一个值是空的,那么我可以读取它,但在以下情况下,有些是空值,有些值与其他值不在同一行。请建议我如何才能将所有值拉到“description 4”之下。

整个斜体文本下方,中间有列,是我需要获取Description 4的地方

A.保证并表示对下面列出的和/或其中包含的移动设备具有完整的法律所有权,不受所有留置权和 esffcswes 和 cdwswy 的此类所有权,以及任何 regqsdfon 和文件(如 适用),自删除或(如适用)之日起生效。

                                                                                                           Description
   Description 1.          Description 2              Description 3            Description 4
                                                                                                          Amount ($)

                                                                               LSMSNDHAM107            25,000
   Variable length value             DCX12300                     1
                                                                                XWSAQ23A1CM
   VariableLengthValue                                        1                                               4,000

B.如果将要删除遗嘱,费用自费,安排在正常工作时间或按时删除。 以此类推文档将继续。

【问题讨论】:

  • 尝试使用 ASCI 表生成器(如 this)向我们展示您的意思,因为很难理解您刚刚在问题中粘贴的内容
  • 如果您此时根本没有真正编写 Python 代码,那么限制到 Python 2.x(带有 python-2.7 标签)似乎是非常错误的。 Python 2 仍然存在几年是有原因的,但这肯定不是鼓励用 Python 2 编写新程序。

标签: python python-2.7 shell unix


【解决方案1】:

原始版本问题的答案

根据您的示例输入,您需要的值似乎位于文件的第 80 到 95 列中。如果是这种情况,那么使用cut:

$ cut -b80-95 File

Description 4


LSMSNDHAM107    

 XWSAQ23A1CM

如果你不想要空行,我们可以使用:

$ cut -b80-95 File | grep '[^[:space:]]'
Description 4
LSMSNDHAM107    
 XWSAQ23A1CM

修改问题的答案

在修改后的问题中,表格前后都有这样的文字段落:

$ cat file2
A.  warrants and represents to  that  has full legal title to the  listed below and/or mobile  in which the  is contained , free and clear of all liens and esffcswes and cdwswys such title, and any regqsdfon and  documents (as
   applicable), to effective as of the date of the removal or of the (as applicable).

                                                                                                               Description
       Description 1.          Description 2              Description 3            Description 4
                                                                                                              Amount ($)

                                                                                   LSMSNDHAM107            25,000
       Variable length value             DCX12300                     1
                                                                                    XWSAQ23A1CM
       VariableLengthValue                                        1                                               4,000


B. In cases where will be removing the  will, at its expense, arrange for removal of the  during  normal business hours or on aschedule.

我们可以从段落之间的表格中选择第4列,如下所示:

$ awk 'f && /^[[:alnum:]]/{exit} f{s=substr($0, 80, 15)} f && s~/[[:alnum:]]/{print s} /Description 4/{f=1}' file2
    LSMSNDHAM10
     XWSAQ23A1C

工作原理:

代码使用变量f 作为标志:当我们在要打印的行范围内时它是一(真),而在其他地方它是零(假)。

  • f && /^[[:alnum:]]/{exit}

    如果f 为真并且当前行以字母数字字符开头,那么我们已经到达表格的末尾并且我们exit 程序。

  • f{s=substr($0, 80, 15)}

    如果f 为真,那么我们将当前行的字符80 到95 保存在变量s 中。

  • f && s~/[[:alnum:]]/{print s}

    如果 f 为真并且变量 s 包含任何字母数字字符,则我们打印 s。

  • /Description 4/{f=1}

    如果当前行匹配正则表达式Description 4,那么我们将f 设置为1。

保持这些命令的顺序很重要。

【讨论】:

  • 感谢您的回复,很抱歉我一开始没有给出完整的文本,我现在已经更新了。我们有前后段落。
  • 然后可能sed -n '1,/Description 4/d;/^ /q;/[^ ]/p' file | cut -b80-95 先提取你想要的部分。
  • @John1024 你能解释一下吗,因为这适用于大多数文件,但对于少数我从表格下方的段落中获取文本。
  • @ankitpandey 我刚刚添加了一个解释。如果您从表格后面获取线条,那么问题可能出在测试/^[[:alnum:]]/ 上。此测试假定任何第一个字符为字母数字(非空白)的行都标记表的结尾。根据问题文件的外观,您可能需要进行不同的测试。
猜你喜欢
  • 2021-05-26
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 2016-05-19
相关资源
最近更新 更多