команда awk в unix - PullRequest
       4

команда awk в unix

0 голосов
/ 11 января 2011

почему цикл while выполняется только один раз в следующем скрипте?

#!/bin/ksh
awk '
{site=$1; print $2;
    while (getline <"portison.result")
    {
      var=substr($2, 0, 3)
      if (site == var)
          print $0
    }
}
' sites.cfg

portison.result Файл содержит:

0       AGAMS3  EDGE    NTS     2347629,,,RHe

10      AGNSD9  EDGE    NTS     2340447,,,TRf

100     AGBSN0  EDGE    NTS     2323735,,,BRc

2       AGUMS3  EDGE    NTS     2347629,,,RHe

20      AGWSD9  EDGE    NTS     2340447,,,TRf

200     AGLSN0  EDGE    NTS     2323735,,,BRc

3       AGDMS3  EDGE    NTS     2347629,,,RHe

30      AGSSD9  EDGE    NTS     2340447,,,TRf

300     AGESN0  EDGE    NTS     2323735,,,BRc

4       AGNSD9  EDGE    NTS     2340447,,,TRf

40      AGAMS3  EDGE    NTS     2347629,,,RHe

400     AGCSN0  EDGE    NTS     2323735,,,BRc

5       AGISN0  EDGE    NTS     2323735,,,BRc

500     AGISN0  EDGE    NTS     2323735,,,BRc

sites.cfg содержит:

AGA     Glasgow                       AQ

AGN     Newport                      TR

AGB     Bridgend                      BR

AGU     Sunderland                   RH

AGW     Swansea                       SW

AGL     Marine Wharf               MW

AGD     Dudley                          DU

AGS     Brighton                       SU

AGE     Southend                      ES

AGC     Solent                          CH

AGI     Isle of Man                  IM and PB

Я хочу выводить как:

Glasgow
0 AGAMS3 EDGE NTS 2347629,,,RHe
40 AGAMS3 EDGE NTS 2347629,,,RHe

Newport
10 AGNSD9 EDGE NTS 2340447,,,TRf
4 AGNSD9 EDGE NTS 2340447,,,TRf

Bridgend
100 AGBSN0 EDGE NTS 2323735,,,BRc

Sunderland
2 AGUMS3 EDGE NTS 2347629,,,RHe

Swansea
20 AGWSD9 EDGE NTS 2340447,,,TRf

Marine
200 AGLSN0 EDGE NTS 2323735,,,BRc

Dudley
3 AGDMS3 EDGE NTS 2347629,,,RHe

Brighton
30 AGSSD9 EDGE NTS 2340447,,,TRf

Southend
300 AGESN0 EDGE NTS 2323735,,,BRc

Solent
400 AGCSN0 EDGE NTS 2323735,,,BRc

Isle
5 AGISN0 EDGE NTS 2323735,,,BRc
500 AGISN0 EDGE NTS 2323735,,,BRc

Ответы [ 3 ]

2 голосов
/ 11 января 2011

Вы должны закрыть «portison.result», чтобы заставить awk снова открыть его в следующем цикле чтения;Кроме того, вам нужно избегать пустых строк:

awk '
    !/^$/{
        site=$1; 
        printf $2;

        while (getline <"portison.result") {
            var=substr($2, 0, 3)
            if (site == var)
                printf " " $0
        }
        print "";
        close("portison.result");
    }' sites.cfg
2 голосов
/ 11 января 2011

Ваша строка while должна быть

while ((getline <"portison.result")> 0)

, в противном случае сравнение while неоднозначно и не будетиспользуя результат getline

Также, как отмечает @marco, вам нужно закрыть файл с помощью close("portison.result") после цикла while

0 голосов
/ 12 января 2011

В зависимости от размера ваших файлов и важности порядка вывода, вы можете обнаружить, что это будет значительно быстрее, чем перебирать каждую строку в одном файле для каждой строки в другой:1003 * Для запуска:

 $ ./script.awk sites.cfg portison.result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...