使用剪切过滤固定宽度的文件

时间:2019-02-27 19:29:44

标签: awk grep cut

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

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来做到这一点。当然有可能,但是我无法解决。

2 个答案:

答案 0 :(得分:2)

像这样?使用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

答案 1 :(得分:0)

使用GNU awk的FIELDWIDTHS:

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