我想使用
cut
命令提取 csv 文件的某些列。
然而,我不想将我的标准硬编码,而是想从 bash 变量中获取它们。
如果没有变量,我的命令将如下所示:
cut -d';' -f 1-8,20,22 "$input_file" > ANFR_reduced.csv
但是,当我将条件
-f 1-8,20,22
存储在 bash 变量中时,我的 cut
命令无法正确执行(错误字段从 1 开始编号)
criteria_col="-f 1-8,20,22"
cut -d';' "$criteria_col" "$input_file" > ANFR_reduced.csv
请问有什么办法可以解释为什么这不起作用吗?
如果启用调试模式 (
set -xv
),您将看到 bash
所看到的内容:
$ touch some_file
$ criteria_col="-f 1-8,20,22"
$ set -xv
$ cut -d';' "$criteria_col" some_file
+ cut '-d;' '-f 1-8,20,22' some_file
^^^^^^^^^^^^^^
cut: fields are numbered from 1
Try 'cut --help' for more information.
请注意,
-f 1-8,20,22
被视为单个字符串 '-f 1-8,20,22'
,这反过来会导致错误。
一个简单的修复方法是将
-f
从变量移动到命令行,例如:
$ criteria_col="1-8,20,22"
$ cut -d';' -f "$criteria_col" some_file
^^
+ cut '-d;' -f 1-8,20,22 some_file
$ # no error; no output since my file is empty
如果您需要
-f
成为标准的一部分,则建议使用 F.Hauri 的评论/建议(使用数组)。