使用Automator服务拆分csv文件(Finder上下文菜单)

时间:2017-08-09 14:20:18

标签: bash macos automator

我正在尝试为 Finder 的右键单击上下文菜单创建一个Automator 服务 ,可以拆分任何选定的csv文件,同时复制每个文件顶部的原始标题。

我目前的尝试是让Automator运行this Bash Shell Script

#!/bin/bash

FILE=$(ls -1 | grep MY_CSV_FILE.csv)
NAME=${FILE%%.csv}

head -1 $FILE > header.csv
tail -n +2 $FILE > data.csv

split -l 50 data.csv

for a in x??
    do
        cat header.csv $a > $NAME.$a.csv
    done

rm header.csv data.csv x??

此脚本会将MY_CSV_FILE.csv拆分为最多50行的新文件,同时复制每个文件顶部的原始标题。新文件的原始名称将附加xaaxabxac等。

关于Automator设置,这是我目前正在处理的服务。现在的问题是我无法将Finder中的Selected File传递给Bash脚本。

enter image description here

请注意:

  • 服务在 Finder.app 中收到:文件或文件夹
  • 将输入传递给Shell脚本:作为参数
  • 我已从Shell脚本顶部删除#!/bin/bash并将Shell设置为: / bin / bash
  • 我为MY_CSV_FILE.csv切换了"$f" - 不确定这是否正确。

我是否还需要为输入文件和生成的输出文件使用类似"$@"的内容指定路径?我之前没有做过类似的事情,所以我并不熟悉那个变量和"$f"

我怎么能让这个工作?我希望生成的文件显示在与我选择运行服务的文件相同的文件夹中,通过Finder右键菜单。如果服务只接受csv文件会更好。

enter image description here

2 个答案:

答案 0 :(得分:1)

我编辑你的脚本以满足需求

set -e

for FILE in "$@"
do
        #must be a file size bigger than zero with extension csv
        if test -f ${FILE}  && test -s ${FILE} &&  test ${FILE: -4} == ".csv" ; then
                NAME=${FILE%%.csv}


                head -1 ${FILE} > header.csv
                tail -n +2 ${FILE} > data.csv

                split -l 50 data.csv

                for a in x??
                do
                        cat header.csv ${a} > ${NAME}.${a}.csv
                done

                rm header.csv data.csv x??

        fi
done

如果您的目录header.csv data.csv中包含此类文件或任何与glob模式x??匹配的文件,请注意原始脚本不是那么安全。执行rm header.csv data.csv x??时将删除所有这些文件。

答案 1 :(得分:0)

使用$ 1,$ 2,$ 3等来访问传递给脚本的参数。如果要将所有参数都引用为数组,请使用$ @。