Bash 如何读取存储在变量中的CSV文件

Bash 如何读取存储在变量中的CSV文件,bash,shell,csv,unix,Bash,Shell,Csv,Unix,我想用Shell读取CSV文件, 但由于某种原因,它不起作用 我使用此选项在我的csv文件夹中查找最新添加的csv文件 lastCSV=$(ls -t csv-output/ | head -1) 这是用来数线的 wc -l $lastCSV 输出 wc: drupal_site_livinglab.csv: No such file or directory 如果我回显文件,它会说:drupal\u site\u livinglab.csv您的问题是,您的目录与您尝试读取的路径相差一个目

我想用Shell读取CSV文件, 但由于某种原因,它不起作用

我使用此选项在我的csv文件夹中查找最新添加的csv文件

lastCSV=$(ls -t csv-output/ | head -1)
这是用来数线的

wc -l $lastCSV
输出

wc: drupal_site_livinglab.csv: No such file or directory

如果我回显文件,它会说:drupal\u site\u livinglab.csv

您的问题是,您的目录与您尝试读取的路径相差一个目录。快速修复方法是
wc-l“csv输出/$lastcv”

请记住,解析<代码> ls -t/c>虽然很方便,但并不完全健壮,所以你应该考虑这样的东西来保护你免受尴尬的文件名的影响:

last_csv=$(find csv-output/ -mindepth 1 -maxdepth 1 -printf '%T@\t%p\0' |
  sort -znr | head -zn1 | cut -zf2-)
wc -l "$last_csv"
  • GNU
    find
    列出所有文件及其上次修改时间,使用空字节分隔输出,以避免出现文件名不正确的问题。
    • 如果删除
      -maxdepth 1
      ,这将成为递归搜索
  • GNU
    sort
    从最新到最旧排列文件,使用
    -z
    接受以空字节分隔的输入
  • GNU
    head-z
    返回排序列表中的第一条记录
  • 最后的GNU
    cut-z
    丢弃时间戳,只留下文件名
您还可以将
find
替换为
stat
(同样,这假设您拥有GNU coreutils):


有没有办法将行数存储到另一个变量中?如果要计算文件数,只需使用
files=(csv output/*);回显“${文件[@]}”
last_csv=$(stat csv-output/* --printf '%Y\t%n\0' | sort -znr | head -zn1 | cut -zf2-)