gawk-csv(및 gawkextlib)를 설치하는 방법은 무엇입니까?

gawk-csv(및 gawkextlib)를 설치하는 방법은 무엇입니까?

간단하고 객관적인 설치방법이 있습니다CSV 확장자gawk?


멈춰봐..한걸음 더 필요해

우분투 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.

두 가지 상충되는 지침이 있습니다.읽어보기 파일그리고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/gawk. apt이다 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

마지막 팁 - makeinfo우분투에서 설치하지 않는 데 문제가 있는 경우:

sudo apt-get install texinfo

관련 정보