【问题标题】:Using cut to filter a fixed width file使用 cut 过滤固定宽度的文件
【发布时间】:2019-02-28 08:01:24
【问题描述】:

假设我有一个这样的文件:

1        10        20        30        40       50
==================================================
foofoofoo1111111111bblah      moreblahblblahblah
foofoofoo2          foofoo              stuffhere

================================================ ==

我想返回位置 11-20 和 31-40 为空白的所有行。我可以使用 cut 来识别它们:

cut -b 11-20,31-40 < source.txt

返回那些位置的字符。

====================
111111111bmoreblahbl

====================

第二行(忽略 === 的行)全是空白。 我想将这些字符为空白/空格的整行(所以这里的第二行)重定向到一个新文件。我不知道如何结合 cut 和 grep 来做到这一点。这肯定有可能,但我无法解决。

【问题讨论】:

  • 111111111从何而来?请将该示例输入的所需输出添加到您的问题中。
  • @Cyrus - 该死,对不起,我的复制/粘贴错误。

标签: awk grep cut


【解决方案1】:

这样的?使用 awk:

$ awk 'substr($0,11,10) substr($0,31,10)~/^ *$/' file
foofoofoo2          foofoo              stuffhere

解释:

$ awk '
substr($0,11,10) substr($0,31,10)~/^ *$/ # positions 11-20 and 31-40 are all space
' file

使用grep

$ grep "^.\{10\} \{10\}.\{10\} \{10\}" file

从开头 (^) 开始,有 10 个任意字符 (.\{10\}),然后是 10 个空格 (\{10\}),然后重复。

编辑

grep 的较短版本:

$ grep "^\(.\{10\} \{10\}\)\{2\}" file

【讨论】:

    【解决方案2】:

    对于 FIELDWIDTHS 使用 GNU awk:

    $ awk -v FIELDWIDTHS='10 10 10 10' '$2$4~/^ *$/' file
    foofoofoo2          foofoo              stuffhere
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2012-10-03
      • 1970-01-01
      • 2014-12-10
      • 2013-01-01
      • 1970-01-01
      相关资源
      最近更新 更多