使linux SPLIT命令与Mac OS终端兼容

时间:2017-12-04 10:53:02

标签: linux bash macos

我有一个bash脚本在linux上工作正常,但是当我在我的Mac终端上运行它时会失败,因为split命令的选项在Mac终端中略有不同。我的剧本是:

## Merge and half final two segments
last_file=`ls temp_filt.snplist_* | tail -n 1`
penultimate_file=`ls temp_filt.snplist_* | tail -n 2 | head -1`
cat $penultimate_file $last_file > temp && mv temp $penultimate_file
split -n l/2 $penultimate_file && mv xaa $penultimate_file; mv xab $last_file

脚本在最后一行失败,因为-n l/2并不存在于tcsh中(Mac OS 10.x.x中的默认shel环境)。我想知道tcsh中的等效脚本是什么。

是否有通用的方法在Mac OS终端中运行linux脚本,而无需更改脚本?

2 个答案:

答案 0 :(得分:5)

不是MacOS终端正在进行split。这是一个名为split的程序。 MacOS基于FreeBSD用户态工具,其行为与GNU工具不同。

有两种选择:

  • 在Linux机器上安装FreeBSD工具,使它们与FreeBSD兼容。

  • 在MacOS计算机上安装GNU utils。如果您有brew,则可以使用brew install coreutils

  • 执行此操作

答案 1 :(得分:1)

选项是使用语言内置函数并限制外部命令

注意脚本包含几个缺陷:ls没用,解析ls输出不安全

array=(temp_filt.snplist_*)
last_file=${array[ -1]}
penultimate_file=${array[ -2]}

如果文件很大,那么内置读取的速度会非常慢。

在这种情况下使用catwcheadtail在系统之间兼容的简单解决方案。注意在命令中传入时必须使用双引号来避免单词分割。

cat "$penultimate_file" "$last_file" > temp || exit 1
nb_lines=$(wc -l < temp)
((half_nb_lines=nb_lines/2))
head "-$half_nb_lines" temp > "$penultimate_file" || exit 1
tail "+$((half_nb_lines+1))" temp > "$last_file" || exit 1
rm temp

请注意最后一行

command1 && command2 ; command3

执行command3,无论第一个退出状态是什么,{; }可用于分组命令

command1 && { command2 ; command3; }