поиск по номеру столбца (не поля) с помощью awk - PullRequest
2 голосов
/ 30 августа 2010

Есть ли способ фильтрации строк с помощью awk по номеру столбца (не поля)? Я хочу захватить все строки в текстовом файле, содержащем значение поля 6, которое назначено переменной. Я использую:

awk -v temp=${het} '{if $6 == temp} print $0}'  

Но я заметил, что очень редко поле 5 остается пустым, что все портит. Что мне действительно нужно, так это

if colx-y == temp  

но этого не существует. Есть ли способ сделать это

формат ввода такой, как описано ниже, и я только что нашел другой вариант, с которым мне приходится иметь дело. Я хочу извлечь (в данном случае) 602. Пятое поле может существовать или не существовать, а также может доходить до 6-го (оба примера ниже). Формат файла имеет столбцы 23-26, содержащие 6-е поле - gawk звучит так, как будто это лучший вариант:

HETATM 5307  S   MOY A 602      14.660  14.666 109.556  1.00 26.41           S  
HETATM 5307  S   MOY   602      14.660  14.666 109.556  1.00 26.41           S  
HETATM 5307  S   MOY A1602      14.660  14.666 109.556  1.00 26.41           S     

Ответы [ 4 ]

2 голосов
/ 30 августа 2010

Пожалуйста, добавьте пример ввода к вашему вопросу, а не к комментарию. До сих пор не ясно, как выглядит ваш вклад. Учитывая вашу «нормальную» строку ввода:

HETATM 5307 S MOY A 602 14.660 14.666 109.556 1.00 26.41 S  

Какая из следующих двух совпадает с вашим вводом с 'поле 5 пусто':

HETATM 5307 S MOY  602 14.660 14.666 109.556 1.00 26.41 S  
HETATM 5307 S MOY   602 14.660 14.666 109.556 1.00 26.41 S  

В первом случае ответ ghostdog74 должен работать. -F"[ ]", который он использует, является умным способом разделения только на отдельные пробелы. -F" " не работает, потому что тогда awk использует расщепление пробелов по умолчанию.

Если ваши данные имеют второй формат, я бы использовал substr(), чтобы извлечь правильное поле:

 awk -v temp=${het} 'substr($0, 20, 3) == temp'

Другим вариантом может быть использование gawk разбиения фиксированной ширины , но оно действительно зависит от точного формата вашего ввода.

0 голосов
/ 30 августа 2010

На основании предложения Скотта и данных вашего примера:

awk -v FIELDWIDTHS="6 1 4 2 1 3 3 1 1 1 3" '{print $11}'

Финальный «3» в FIELDWIDTHS представляет поле, содержащее «602».Я опустил ширину поля для остальной части строки.Некоторые из значений ширины поля можно было бы объединить, но я не знал, что было пробелом в качестве разделителей по сравнению с пробелами в качестве содержимого поля.

0 голосов
/ 30 августа 2010
awk -F"[ ]" -v temp=${het} '$6==temp' file
0 голосов
/ 30 августа 2010

почему вы не используете, если еще?

как показано ниже:

if $5 is not blank
{ 
if $6==temp print $0
}
else if $7==temp print $0

Было бы также легче понять, если вы предоставите образец ввода!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...