簡體   English   中英

gawk 和 mawk 的區別(列寬)

[英]The differences between gawk and mawk (column width)

我有一個文件:

To jest długi string z wieloma polskimi literami ąółżęś kodowany w UTF8, 
żeby 
było śmieszniej, haha.
ą
a

示例傻瓜:

gawk '{printf "%-80s %-s\n", $0, length}' file

在 gawk 中,我得到了正確的結果:

To jest długi string z wieloma polskimi literami ąółżęś kodowany w UTF8,         73
żeby                                                                             5
było śmieszniej, haha.                                                           22
ą                                                                                1
a                                                                                1

在 gawk 中,我得到了正確的結果:


示例:

mawk '{printf "%-80s %-s\n", $0, length}' file
To jest długi string z wieloma polskimi literami ąółżęś kodowany w UTF8,  80
żeby                                                                            6
było śmieszniej, haha.                                                         24
ą                                                                               2
a                                                                                1

在 mawk 中,我得到了不正確的結果:

作為 mawk 得到與 gawk 相同的結果?

mawk 是一個功能最少的 awk,旨在提高執行速度而不是功能。 您不應期望它的行為與 gawk 或 POSIX awk 完全相同。 如果您要使用 mawk,則需要獲取描述 IT 行為方式的mawk 手冊,不要依賴任何其他描述其他 awk 行為方式的文檔。

恕我直言,格式化字符串%-s沒有正確的結果,因為在不指定對齊寬度的情況下對齊字符串是沒有意義的。 對於length本身的含義也有不同的解釋 - 它可能是length($0)的簡寫,也可能是非 POSIX awk 中的其他東西,在某些非 POSIX awk 中甚至可能沒有長度函數因此它可能會將其視為未定義的變量名。 任何給定的 awk 如何處理非英文字符?

正如我所說 - 如果您要使用非 POSIX awk,您需要查看該 awk 的手冊以了解所有血腥細節......

我假設您使用的是不同的系統...因為系統上的 awk 安裝曾經是 gawk 或 mawk 的符號鏈接。

只要版本一致,所有 awk 版本都是兼容的。

因此,我假設您面臨的問題是由於使用了舊版本和新版本的程序。

更新1:意識到我可以大規模簡化它-

  • 唯一需要做的就是將UTF-8連續字節的計數填充到總寬度中,並通過這樣定義FS ,那么對於非空行,計數將始終為NF - 1 ,尾部的計數行尾反映了UTF-8 character count (嚴格來說……這是一個代碼點數)

    警告:此代碼大膽假設輸入是有效UTF-8開頭,不執行數據驗證檢查

=

mawk[1/2]|gawk -b '

$!NF = sprintf("%-*s %s",(__=NF-!_)+80,$_,length($_)-__)' FS='[\\200-\\277]'

=

To jest długi string z wieloma polskimi literami ąółżęś kodowany w UTF8,         73
żeby                                                                             5
było śmieszniej, haha.                                                           22
ą                                                                                1
a                                                                                1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM