私はApple MacOとUbuntuの間で移植する必要があるスクリプトを書いています。前者の「awk」はnawkによって提供され、後者はgawkによって提供されるものです。実装間には大きな違いがあります。
特に私はUbuntu 22.04LTSで開発していますが、残念ながら...
# apt install nawk
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package nawk
(Debian Bullseyeでも同じ)
また、nawkソースコードをダウンロードしてコンパイルしてみましたが、私のディストリビューションではyaccを使用できず、Bisonはmakefileを実行するのと同じくらい互換性がありません。
ぼやけさせる方法がありますか?パフォーマンス錆のような?
失敗した場合、リポジトリから情報を取得できるLinuxディストリビューションはありますか?
答え1
nawk
はい、リポジトリには1つ以上のリリースがあります。私はたくさんあると確信していますが、私のArchシステムでこの記事を書いており、Archに次のものがあることを確認できますnawk
。
$ pacman -Ss nawk
community/nawk 20220912-1 [installed]
The one, true implementation of AWK
つまり、ここで役に立つトリックはbusyboxを使用することですawk
。忙しい箱さまざまな標準ツールの簡素化されたバージョンを提供する組み込みシステムで非常に便利で一般的な優れたツールです。
BusyBoxは、多くの一般的なUNIXユーティリティの小さなバージョンを小さな実行可能ファイルに結合します。通常、GNU fileutils、shellutilsなどで見つけることができるほとんどのユーティリティを置き換えます。 BusyBoxのユーティリティは、一般的にフル機能のGNUユーティリティよりもオプションが少ないです。ただし、含まれているオプションは期待される機能を提供し、GNUユーティリティと非常によく似ています。 BusyBoxは、小規模システムや組み込みシステムに非常に完全な環境を提供します。
それが提供するツールの1つはUbuntu()にインストールされているawk
場合は最小限です。busybox
sudo apt install busybox
busybox awk
awk
いいえ nawk
awk
しかし、これはより良いパフォーマンスを提供する必要があるシンプルでシンプルなバージョンですgawk
。スクリプトがbusyboxで動作している場合は、busyboxawk
でも動作する可能性が高くなります。これは完璧な解決策ではありません。私は見つけました。gawk
nawk
コメントサイトのもう一つの答えは「実際、BusyBoxはv3awk
と非常によく似ています。gawk
nawk
しかし、これは始まりに過ぎません。
最後に、おそらく最も関連性の高いgawk
ものは実際に--posix
オプション:
-血
--posix
厳格なPOSIXモードで動作します。これは --traditional と同様に、すべての gawk 拡張を無効にし、POSIX で許可されていないすべての拡張を無効にします。バラより一般的に使用される拡張機能の概要このオプションで無効にされた gawk の拡張機能の概要です。また、次の追加制限が適用されます。
「?」後には改行文字や「:」は使用できません(参照)。条件式)。コマンドラインに「-Ft」を指定すると、FS値は単一のタブに設定されません(参照:フィールドの区切り方法の指定)。ロケールの小数点文字は入力データを解析するために使用されます(参照あなたの場所はさまざまです)。
コマンドラインに--traditionalと--posixの両方を提供する場合、--posixが優先されます。 gawk は、両方のオプションが提供された場合に警告を出します。
したがって、最良の方法は、gawk --posix
テスト中に移植可能な機能のみが使用されることを確認することです。
またはそうでないかもしれません。エドモートン私たちの常駐awkの専門家の一人が、現在削除されているコメントで次のように語っています。
gawk --posix
ポータブル機能のみを使用する保証はありません。たとえば、このオプションセットを使用すると、文字列内のすべての文字がsplit("foo",arr,"")
埋められますが、他のawkは文字列全体の個々の項目を埋めたり、別の操作を実行したり、空の文字列を区切り文字として使用したりすることはできません。 POSIXと互換性があります。アクション。 gawk拡張をオフにすることはすべてですが、POSIXで定義されていない動作に対してgawk実装に依存するコードを書くには、手動管理が必要です。 ——エドモートンarr[]
"foo"
arr[]
"foo"
--posix
Edは私よりもawkについてもっと知っているので、彼の言葉を受け入れます。
答え2
もう少し検索したところ、nawkの最新バージョンが見つかりました(または少なくとも私は信じるこれは言えない)、道路標識はhttps://www.cs.princeton.edu/~bwk/btl.mirror/index.html存在するhttps://github.com/onetrueawk/awk
それでも誰かがより良い提案があるかどうかを確認したいと思います。
答え3
このタイプの質問に対する答えは、クロスプラットフォームプロジェクトが必要であるということです。
プロジェクトを実行する必要があるプラットフォームでプロジェクトを確認し、必要な準備を実行し、テストケースのコレクションを実行できる必要があります。
新しいバージョンのスクリプトをリリースするたびに、次のテスト計画を実行する必要があります。サポートされているすべてのプラットフォームでリリース基準を更新し、テストケースを実行し、すべてが正しく機能するようにする必要がある他のテストプランを実行します。サポートされているすべてのプラットフォームに対する自信。
少し注意を払うと、GNU Awk、nawkなどで同じ結果を生成するAwkコードを書くことができます。
私はソースコードを見つけてコンパイルしましたが、私のディストリビューションではyaccを使用できず、Bisonは十分に互換性がありません。
私は「One True Awk」プロジェクトが非常に愚かなことをしていることを発見しました。定義今、makefile
文法ファイルは、ユーザーがインストールしたBisonバージョンのデフォルトの動作に影響されます。問題をさらに複雑にすることは、プロジェクトが管理者が実際に構築してテストする生成されたパーサーソースを提供しないことです。したがって、ダウンストリームユーザーはプログラムのかなりの部分に対して異なるCコードを実行します。YACC = bison -d
awkgram.y
Bisonのインストールに問題がある場合、またはパラメータがない場合はYaccではありませんbison --yacc -d
。bison
-y
--yacc
失敗した場合は、他のプラットフォームでパーサーを作成し、生成されたファイルを使用してください。
プラットフォームAでnawkを実行しても、テストなしでコードがプラットフォームBで実行されると仮定できるというわけではありません。
とにかくそうです。本当の奇妙なソースコードにはYaccによって生成されたパーサは含まれていません。これはエラーです。あなたができることは、そのプラットフォームでYaccを実行し、結果y.tab.c
とy.tab.h
ファイルをローカルツリーに追加することです。ファイルを再作成またはawkgram.y
調整makefile
しようとしないように、タイムスタンプをタッチしてファイルが最新であることを確認してくださいmakefile
。
Yaccプログラムは、ダウンストリームユーザーがYaccをインストールせずにプログラムを構築できるように、移植可能なC出力を生成します。 Yacc構文を使用するプロジェクトは、すべてのダウンストリームが同じCをコンパイルできるように、常に生成されたコードを公開する必要があります。人々は同じCソースコードを持っていますが、他のシステムや環境に合わせて構築するのは十分に危険です。
awkgram.y
BisonがBrian Kernighanのawkファイルを処理できないことに驚きました。bison --yacc
またはを使用する必要がありますbison -y
。 BisonがYacc実装を提供するシステムには、通常、引数をまたはyacc
にbison -y
渡すスクリプトがありますbison --yacc
。 Bison 3.0.4がデフォルトhttps://github.com/onetrueawk/awk.git
でインストールされているUbuntu 18インスタンスを確認しましたが、/usr/local/bin
どちらもawkgram.y
エラーなく受け入れました。