使用csvtool调用在bash中过滤csv

Geo*_*rge 4 csv bash

我正在尝试通过特定列中的值过滤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版,因此该错误报告不适用。

有什么想法我在做错什么或更好的方法来处理手头的任务吗?

lar*_*sks 6

我已经安装了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模块。