我正在尝试通过特定列中的值过滤csv。我的脚本当前如下所示:
function csv_grep {
if [ $1 == "$SEARCH_TERM" ]
then
echo "$2"
fi
}
export -f csv_grep
VALUES=$(csvtool namedcol col1,col2 dictionary.csv | csvtool call csv_grep -)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时,我得到
/bin/bash: csv_grep: command not found
csv_grep: terminated with exit code 127
Run Code Online (Sandbox Code Playgroud)
我已经安装了1.4.2-1版,因此该错误报告不适用。
有什么想法我在做错什么或更好的方法来处理手头的任务吗?
我已经安装了1.4.2-1版,因此该错误报告不适用。
实际上,您似乎已经完全解决了该错误报告中描述的问题,我们可以通过简单的测试进行验证。这是我的测试环境:
# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
# dpkg -l csvtool
||/ Name Version Architecture Description
+++-==============-============-============-=================================
ii csvtool 1.4.2-1 amd64 handy command line tool for handl
Run Code Online (Sandbox Code Playgroud)
让我们创建和导出一个函数:
testfunction() {
echo column one is "$1"
}
export -f testfunction
Run Code Online (Sandbox Code Playgroud)
并确认它已成功导出:
$ bash -c 'testfunction one'
column one is one
Run Code Online (Sandbox Code Playgroud)
现在,我们尝试使用调用它csvtool:
$ echo one,two,three | csvtool call testfunction -
/bin/bash: testfunction: command not found
testfunction: terminated with exit code 127
Run Code Online (Sandbox Code Playgroud)
考虑到错误报告,让我们看一下/bin/sh:
$ ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 Oct 3 09:58 /bin/sh -> dash
Run Code Online (Sandbox Code Playgroud)
事实/bin/sh并非如此/bin/bash。让我们修复一下:
$ sudo ln -sf /bin/bash /bin/sh
$ ls -l /bin/sh
lrwxrwxrwx. 1 root root 9 Oct 3 10:05 /bin/sh -> /bin/bash
Run Code Online (Sandbox Code Playgroud)
再试csvtool一次:
$ echo one,two,three | csvtool call testfunction -
column one is one
Run Code Online (Sandbox Code Playgroud)
有什么想法我在做错什么或更好的方法来处理手头的任务吗?
我永远不会尝试在shell脚本中处理csv文件。我可能会接触到Python和csv模块。