Использование cut для фильтрации файла с фиксированной шириной - PullRequest
0 голосов
/ 27 февраля 2019

Допустим, у меня есть такой файл:

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 голосов
/ 28 февраля 2019

С GNU awk для FIELDWIDTHS:

$ awk -v FIELDWIDTHS='10 10 10 10' '$2$4~/^ *$/' file
foofoofoo2          foofoo              stuffhere
0 голосов
/ 27 февраля 2019

Как то так?Использование 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
...