간단하고 객관적인 설치방법이 있습니다CSV 확장자gawk
?
멈춰봐..한걸음 더 필요해
우분투 18 LTS를 사용하세요.
wget -c http://ftp.gnu.org/gnu/gawk/gawk-5.0.1.tar.gz
(그리고gawk-5.0.1.tar.gz.sig
)gpg --verify gawk-5.0.1.tar.gz.sig gawk-5.0.1.tar.gz
오류: "RSA 키 DF597815937EC0D2를 사용하여 서명을 확인할 수 없습니다...: 공개 키가 없습니다."tar xvzf gawk-5.0.1.tar.gz
cd gawk-5.0.1
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 --version
4.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.so
gawk 는 그것을 찾고 런타임 라이브러리 경로에 없는 것이 무엇인지 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