awk - 빈 줄 일치

awk - 빈 줄 일치

O'Reilly Sed & Awk 책에서는 awk 표현식을 따르는 것이 빈 줄과 일치해야 한다고 말합니다.

/^$/ {
  print x += 1
}

하지만 Ubuntu 17.04 mawk에서는 작동하지 않는 것 같습니다.
왜 이것이 작동하지 않습니까?

예를 들어
ascii.tbl 텍스트에 대한 쿼리는 아무것도 반환하지 않습니다.

~/temp$ cat ascii.tbl 
|000 nul|001 soh|002 stx|003 etx|004 eot|005 enq|006 ack|007 bel|
|010 bs |011 ht |012 nl |013 vt |014 np |015 cr |016 so |017 si |
|020 dle|021 dc1|022 dc2|023 dc3|024 dc4|025 nak|026 syn|027 etb|
|030 can|031 em |032 sub|033 esc|034 fs |035 gs |036 rs |037 us |
|040 sp |041  ! |042  " |043  # |044  $ |045  % |046  & |047  ' |
|050  ( |051  ) |052  * |053  + |054  , |055  - |056  . |057  / |
|060  0 |061  1 |062  2 |063  3 |064  4 |065  5 |066  6 |067  7 |
|070  8 |071  9 |072  : |073  ; |074  < |075  = |076  > |077  ? |
|100  @ |101  A |102  B |103  C |104  D |105  E |106  F |107  G |
|110  H |111  I |112  J |113  K |114  L |115  M |116  N |117  O |
|120  P |121  Q |122  R |123  S |124  T |125  U |126  V |127  W |
|130  X |131  Y |132  Z |133  [ |134  \ |135  ] |136  ^ |137  _ |
|140  ` |141  a |142  b |143  c |144  d |145  e |146  f |147  g |
|150  h |151  i |152  j |153  k |154  l |155  m |156  n |157  o |
|160  p |161  q |162  r |163  s |164  t |165  u |166  v |167  w |
|170  x |171  y |172  z |173  { |174  | |175  } |176  ~ |177 del|




| 00 nul| 01 soh| 02 stx| 03 etx| 04 eot| 05 enq| 06 ack| 07 bel|
| 08 bs | 09 ht | 0a nl | 0b vt | 0c np | 0d cr | 0e so | 0f si |
| 10 dle| 11 dc1| 12 dc2| 13 dc3| 14 dc4| 15 nak| 16 syn| 17 etb|
| 18 can| 19 em | 1a sub| 1b esc| 1c fs | 1d gs | 1e rs | 1f us |
| 20 sp | 21  ! | 22  " | 23  # | 24  $ | 25  % | 26  & | 27  ' |
| 28  ( | 29  ) | 2a  * | 2b  + | 2c  , | 2d  - | 2e  . | 2f  / |
| 30  0 | 31  1 | 32  2 | 33  3 | 34  4 | 35  5 | 36  6 | 37  7 |
| 38  8 | 39  9 | 3a  : | 3b  ; | 3c  < | 3d  = | 3e  > | 3f  ? |
| 40  @ | 41  A | 42  B | 43  C | 44  D | 45  E | 46  F | 47  G |
| 48  H | 49  I | 4a  J | 4b  K | 4c  L | 4d  M | 4e  N | 4f  O |
| 50  P | 51  Q | 52  R | 53  S | 54  T | 55  U | 56  V | 57  W |
| 58  X | 59  Y | 5a  Z | 5b  [ | 5c  \ | 5d  ] | 5e  ^ | 5f  _ |
| 60  ` | 61  a | 62  b | 63  c | 64  d | 65  e | 66  f | 67  g |
| 68  h | 69  i | 6a  j | 6b  k | 6c  l | 6d  m | 6e  n | 6f  o |
| 70  p | 71  q | 72  r | 73  s | 74  t | 75  u | 76  v | 77  w |
| 78  x | 79  y | 7a  z | 7b  { | 7c  | | 7d  } | 7e  ~ | 7f del|



~/temp$ awk '/^$/ {print "Blank " }' ascii.tbl 
~/temp$ 

업데이트:파일에 CRLF 줄 종결자가 있는 것으로 나타났습니다. dos2unix를 적용하면 작동합니다.

답변1

/^$/빈 줄을 의미하는 조건입니다. 어떻게 작동하나요? ^시작을 의미하고 $끝을 의미합니다. 그래서 ^$우리는 아무것도 없이 시작하고 끝나는 줄(빈 줄)을 찾고 있습니다.

그 후에는 { print x += 1 }이 모든 빈 줄에서 실행됩니다.

x변수입니다. 1값을 더할 때마다 인쇄합니다. 그것은 마치 { print ++x }(먼저 x에 1을 더한 다음 x를 인쇄하는 것과 같습니다).

따라서 코드는 빈 줄을 계산하고 인쇄합니다.

1
2
3
...

빈 줄에 공백이 있으면 다음과 같이 사용해야 합니다.

awk '/^\s*$/ { print "Blank " }' file

답변2

이 코드는 파일의 빈 줄 수만 계산하고 문제 없이 잘 작동합니다.

이 목적으로 다음 명령을 사용할 수 있습니다.

mawk '/^$/ { print x += 1 }' yourfile.txt

아니면 이거:

awk '/^$/ { print x += 1 }' yourfile.txt

이 명령의 출력은 다음과 같습니다.

1
2
3
4

하지만 보고 싶다면 4다음 명령을 사용할 수 있습니다.

awk '!NF {s+=1} END {print s}' yourfile.txt

아니면 이거:

mawk '!NF {s+=1} END {print s}' yourfile.txt

이 명령은 단지 4.

각주: Ubuntu 17.04를 사용하고 있으며 어떤 문제도 발생하지 않았습니다.

lsb_release -ds
Ubuntu 17.04

답변3

아마도 이것은 관용어를 _bucking하는 것입니다. 저는 다음을 건너뛰곤 했습니다:

 ("" == $0){ 
     skipped++;
     next; 
 }

동기 부여... 나는 그것이 가장 효율적이고 가장 깨끗한 것이라고 느꼈습니다. 패턴 일치가 양호합니다. 설정 및 처리에는 여전히 시간이 걸립니다. 다행스럽게도 더 빠른 방법이 있다면 다른 사람들로부터 깨달음을 얻을 것이라고 확신합니다.

관련 정보