O'Reilly Sed & Awk 書籍指出,follow 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 }
(先將 1 加到 x,然後列印 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;
}
動機……我覺得這會是最有效/最乾淨的事情。模式匹配非常好——仍然需要時間來設定和處理。幸運的是,如果有更快的方法,我相信我會受到其他人的啟發。