awk: вывести диапазон полей, если другое поле соответствует значению - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть файл с очень старым форматом. Вот пара строк примеров:

000000582103145338520001        2000111420040924NR19 2RG195006          0119MR<PATRICK JOSEPH ROBERT<SNOWBALL<<<<THE OLD RECTORY<LONGHAM<EAST DEREHAM<NORFOLK<<INSURANCE COMPANY OFFICIAL<BRITISH<<
000000582103015819370001        1994010119981130CR2 8SZ 194205          0096MR<PETER GEOFFREY<WARD<<<<14 SUFFIELD CLOSE<SELSDON<SOUTH CROYDON<<<EXECUTIVE DIRECTOR<ENGLISH<<
000000582203047002770001        1992012619931231N1 8HP  193401          0099<JOHN HOWARD<WEBB<<<<1 SUDELEY STREET<ISLINGTON<LONDON<<<GROUP ACTUARY - COMMERCIAL UNION<BRITISH<<
000000582103000497250003        1998070119981130TN13 1SS195207          0126MR<RICHARD ANDREW<WHITAKER<LLB DMS FCII<<<STRATHBLANE ASHGROVE ROAD<<SEVENOAKS<KENT<<COMPANY SECRETARY<BRITISH<UNITED KINGDOM<
000000781D                      00000020WALKER & ETH PORKER<
000000831D                      00000014REID AND SONS<
000000841D                      00000019A. WEST & PARTNERS<
000000861                       00130029KENTSTONE PROPERTIES LIMITED<

Я пытаюсь получить символы от 41-го до конца строки, если и только если 9-й символ равен 1. Я знаю, что максимальное числоchars после char 41 равно 161.

Вот мой awk - который ломается (в основном пытался составить его из другого кода, найденного в Интернете - здесь не специалист по awk).

awk -v b=41 -v e=201 
'$9 == "1" 
BEGIN{FS=OFS=""} {for (i=b;i<=e;i++) 
printf "%s%s", $i, (i<e ? OFS : ORS)}' 
<(head -n1000 myfile.dat)

Что я ожидаюкод для вывода:

WALKER & ETH PORKER<                                                                                                                                             
REID AND SONS<                                                                                                                                                   
A. WEST & PARTNERS<                                                                                                                                              
KENTSTONE PROPERTIES LIMITED<    

Ответы [ 2 ]

3 голосов
/ 04 ноября 2019

Не могли бы вы попробовать следующее.

awk 'substr($0,9,1) == 1{print substr($0,41)}' Input_file

Объяснение:

awk '                     ##Starting awk program here.
substr($0,9,1) == 1{      ##Using substr for getting sub-string from 9th character to get only 1 character and checking condition if its value is equal to 1. If condition is TRUE then perform following.
  print substr($0,41)     ##Printing sub-string value from 41st character to till end of line(since no last limit is given so it will take complete line from 41st character).
}                         ##Closing BLOCK for condition here.
' Input_file              ##Mentioning Input_file name here.
1 голос
/ 04 ноября 2019

Небольшой вариант поста Равиндера. (gnu awk)

awk -v FS= '$9==1 {print substr($0,41)}' file
WALKER & ETH PORKER<
REID AND SONS<
A. WEST & PARTNERS<
KENTSTONE PROPERTIES LIMITED<

Для получения справки по substr см .: https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html

...