gawk-csv(およびgawkextlib)をインストールする方法は?

gawk-csv(およびgawkextlib)をインストールする方法は?

簡単で客観的な設置方法がありますCSV拡張子gawk


やめてください。さらに一歩必要です。

Ubuntu 18 LTSを使用してください。

  1. wget -c http://ftp.gnu.org/gnu/gawk/gawk-5.0.1.tar.gz(そしてgawk-5.0.1.tar.gz.sig

  2. gpg --verify gawk-5.0.1.tar.gz.sig gawk-5.0.1.tar.gz
    エラー:「RSAキーDF597815937EC0D2を使用して署名を検証できません...:公開鍵がありません。」

  3. tar xvzf gawk-5.0.1.tar.gz

  4. cd gawk-5.0.1

  5. sudo su走った後./configure && make && make check && make install

...
... long long process
...
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/lib/gawk

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
     during linking
   - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
make  install-data-hook
make[4]: Entering directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/extension'
for i in filefuncs.la fnmatch.la fork.la inplace.la intdiv.la ordchr.la readdir.la readfile.la revoutput.la revtwoway.la rwarray.la time.la ; do \
        rm -f /usr/local/lib/gawk/$i ; \
done
make[4]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/extension'
make[3]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/extension'
make[2]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/extension'
make[1]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/extension'
Making install in extras
make[1]: Entering directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/extras'
make[2]: Entering directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/extras'
make[2]: Nothing to be done for 'install-exec-am'.
 /bin/mkdir -p '/usr/local/etc/profile.d'
 .././install-sh -c -m 644 gawk.sh gawk.csh '/usr/local/etc/profile.d'
make[2]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/extras'
make[1]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/extras'
Making install in doc
make[1]: Entering directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/doc'
make[2]: Entering directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/doc'
make[2]: Nothing to be done for 'install-exec-am'.
 /bin/mkdir -p '/usr/local/share/info'
 .././install-sh -c -m 644 ./gawk.info ./gawkinet.info ./gawkworkflow.info '/usr/local/share/info'
 install-info --info-dir='/usr/local/share/info' '/usr/local/share/info/gawk.info'
 install-info --info-dir='/usr/local/share/info' '/usr/local/share/info/gawkinet.info'
 install-info --info-dir='/usr/local/share/info' '/usr/local/share/info/gawkworkflow.info'
 /bin/mkdir -p '/usr/local/share/man/man1'
 .././install-sh -c -m 644 gawk.1 '/usr/local/share/man/man1'
make[2]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/doc'
make[1]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/doc'
Making install in awklib
make[1]: Entering directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/awklib'
make[2]: Entering directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/awklib'
 /bin/mkdir -p '/usr/local/libexec/awk'
  .././install-sh -c pwcat grcat '/usr/local/libexec/awk'
make  install-exec-hook
make[3]: Entering directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/awklib'
/bin/bash ../mkinstalldirs /usr/local/share/awk
mkdir -p -- /usr/local/share/awk
for i in passwd.awk group.awk ./eg/lib/*.awk ; do \
        progname=`echo $i | sed 's;.*/;;'` ; \
        .././install-sh -c -m 644 $i /usr/local/share/awk/$progname ; \
done
make[3]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/awklib'
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/awklib'
make[1]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/awklib'
Making install in po
make[1]: Entering directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/po'
installing ca.gmo as /usr/local/share/locale/ca/LC_MESSAGES/gawk.mo
installing da.gmo as /usr/local/share/locale/da/LC_MESSAGES/gawk.mo
installing de.gmo as /usr/local/share/locale/de/LC_MESSAGES/gawk.mo
installing es.gmo as /usr/local/share/locale/es/LC_MESSAGES/gawk.mo
installing fi.gmo as /usr/local/share/locale/fi/LC_MESSAGES/gawk.mo
installing fr.gmo as /usr/local/share/locale/fr/LC_MESSAGES/gawk.mo
installing id.gmo as /usr/local/share/locale/id/LC_MESSAGES/gawk.mo
installing it.gmo as /usr/local/share/locale/it/LC_MESSAGES/gawk.mo
installing ja.gmo as /usr/local/share/locale/ja/LC_MESSAGES/gawk.mo
installing ko.gmo as /usr/local/share/locale/ko/LC_MESSAGES/gawk.mo
installing ms.gmo as /usr/local/share/locale/ms/LC_MESSAGES/gawk.mo
installing nl.gmo as /usr/local/share/locale/nl/LC_MESSAGES/gawk.mo
installing pl.gmo as /usr/local/share/locale/pl/LC_MESSAGES/gawk.mo
installing pt.gmo as /usr/local/share/locale/pt/LC_MESSAGES/gawk.mo
installing pt_BR.gmo as /usr/local/share/locale/pt_BR/LC_MESSAGES/gawk.mo
installing sv.gmo as /usr/local/share/locale/sv/LC_MESSAGES/gawk.mo
installing vi.gmo as /usr/local/share/locale/vi/LC_MESSAGES/gawk.mo
installing zh_CN.gmo as /usr/local/share/locale/zh_CN/LC_MESSAGES/gawk.mo
if test "gawk" = "gettext-tools"; then \
  /bin/mkdir -p /usr/local/share/gettext/po; \
  for file in Makefile.in.in remove-potcdate.sin quot.sed boldquot.sed [email protected] [email protected] insert-header.sin Rules-quot   Makevars.template; do \
    .././install-sh -c -m 644 ./$file \
                    /usr/local/share/gettext/po/$file; \
  done; \
  for file in Makevars; do \
    rm -f /usr/local/share/gettext/po/$file; \
  done; \
else \
  : ; \
fi
make[1]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/po'
Making install in test
make[1]: Entering directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/test'
make[2]: Entering directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/test'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/test'
make[1]: Leaving directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/test'

問題ないようです。私のテストはgawk --version4.1.1で行われ、現在は5.0.1で行われました。上記のダンプに示すように、make[4]: Entering directory '/home/admin_dq/transfer/AWK/gawk-5.0.1/extension'拡張ライブラリがあるようです。

しかし、今の元の問題は次のとおりです。が必要gawk-csv ですが、「コマンドが見つかりません」です。

ダウンロード方法とCSV拡張機能をインストールしますか?

私も試しましたが、gawk -i csv エラーがあります。"gawk:致命的:読み取りのために 'csv'ソースファイルを開くことができません(そのファイルまたはディレクトリはありません)。」

PS1:インストールされているすべての拡張リストを表示するには? PS2:その他のガイド走らなければならないと言いましたrpmbuild


ノート

要約:ハッキング技術を学ぶのではなく、ツールが必要です。

ツールのLinux名は同じように見えますが、gawk-csvデフォルトライブラリの名前はですgawkextlib

2つの矛盾する指示があります。閲覧ファイルそしてCSV拡張機能のインストール。初めてのみダウンロードできます。

PS:はい6年前の質問はここにありますただし、バージョン1.0.0は2020年までリリースされていませんgawk-csv

CSVが重要です

これは非常に重要な拡張ですクラシックAWKa,b,c、通常のCSVファイルは、AWKが解析する必要があるのではありません。標準CSV引用符、エスケープされた行など

AWKは完璧だが(!)できない簡単なETL操作大容量CSVファイルクラシックAWKの場合は、次のものが必要です。gawk-csv

答え1

このレシピは今私にとって効果的です。 YMMV。

DSTPATH拡張機能をインストールする場所に変更します。

インストールはお勧めできません何もないシステムディレクトリ(例:下/usr)を手動で入力します。展開ツール(など)を介してのみ管理できaptますyum

DSTPATH=/tmp/baz
set -e
git clone https://git.code.sf.net/p/gawkextlib/code gawkextlib-code
cd gawkextlib-code/lib
autoreconf -i
./configure --prefix=$DSTPATH && make -j13 install
cd ../csv
autoreconf -i
./configure --prefix=$DSTPATH --with-gawkextlib=$DSTPATH && make -j13 install

export AWKPATH=$DSTPATH/share/awk AWKLIBPATH=$DSTPATH/lib/gawk
echo foo,bar,baz | gawk -i csv 'csvsplit($0,a){print a[2]}'

IMHO これはすべて過剰であり、失敗する可能性のある方法が何千ものあります(適切な開発ツールの欠如など)。

答え2

/ usrにインストールすることについての議論は、おそらく - csvライブラリを構築するときに見つけた主な問題は、Makefileが指定しなかったことです。走るライブラリをリンクするときにgawkextlibを見つけるために必要なパスですcsv.so。これは、設定がないと、LD_LIBRARY_PATHビルドとインストールが成功したように見えても実行csv.so時に見つからないことを意味します。libgawkextlib.so.0その結果、gawkを呼び出すと次のエラーが発生します。

gawk: csv:15: fatal: load_ext: cannot open library `/usr/local/lib/gawk/csv.so' (libgawkextlib.so.0: cannot open shared object file: No such file or directory)

csv.so/usr/local/lib/gawk/csv.sogawkはそれを探して、ランタイムライブラリのパスにないものが何であるかcsv.soによって異なります。libgawkextlib.so.0

この問題を解決するためのオプションが見つからず、configure最終的にmake出力でリンクラインを再実行しましたが、以下を追加しました。 -Wl,-rpath,/usr/local/lib

-Wl次のオプションをのリンクに直接送信しますgcc

したがって、行全体は次のようになります。 gcc -shared -fPIC -DPIC .libs/csv.o .libs/csv_parser.o .libs/csv_convert.o .libs/csv_split.o .libs/csv_input.o .libs/strbuf.o .libs/awk_fieldwidth_info.o -L/usr/local/lib/ -Wl,-rpath,/usr/local/lib -L/usr/local/bin -lgawkextlib -g -O2 -Wl,-soname -Wl,csv.so -o .libs/csv.so

その後、ライブラリ検索パスを操作せずに見つけることcsv.soができます。libgawkextlib.so.0

$ ldd csv.so 
        linux-vdso.so.1 (0x00007ffda36e6000)
        libgawkextlib.so.0 => /usr/local/lib/libgawkextlib.so.0 (0x00007ffb8f535000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffb8f144000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ffb8f93d000)

Ubuntu 18.04の全体的なプロセスは次のとおりです。ソースからビルドして/usr/local/bin/gawkaptであるsudo apt install build-essential

ソースのインポート:

git clone git://git.code.sf.net/p/gawkextlib/code gawkextlib
cd gawkextlib

libビルド - ここには素晴らしい内容はありません。with-gawkシステムバージョンではなく、gawkのコンパイル済みバージョンを使用していることを確認してください。

cd lib
autoreconf -i
./configure --with-gawk=/usr/local/bin/
make
sudo make install

ライブラリパッチを使用してcsv拡張をビルドします。

cd ../csv
autoreconf -i
./configure --with-gawk=/usr/local/bin/ --with-gawkextlib=/usr/local/lib/
make
gcc -shared  -fPIC -DPIC  .libs/csv.o .libs/csv_parser.o .libs/csv_convert.o .libs/csv_split.o .libs/csv_input.o .libs/strbuf.o .libs/awk_fieldwidth_info.o   -L/usr/local/lib/ -Wl,-rpath,/usr/local/lib -L/usr/local/bin -lgawkextlib  -g -O2   -Wl,-soname -Wl,csv.so -o .libs/csv.so
sudo make install

成功:

$ echo foo,bar,baz | gawk -i csv 'csvsplit($0,a){print a[2]}'
bar

最後のヒント - makeinfoUbuntuでインストールしないのに問題がある場合:

sudo apt-get install texinfo

関連情報