我有一个名为140905_M01771_0112_000000000-ABBYT
.我想得到第三个字段,即0112
。我试过:
cut -d _ -f 3 131230_M01771_0032_000000000-A7874
给我错误:
cut: 131230_M01771_0032_000000000-A7874/: Is a directory
答案1
当您在 的命令行上传递除选项之外的参数时cut
,这是要从中读取数据的文件名。您要求cut
处理 file 中的数据131230_M01771_0032_000000000-A7874
,这会导致错误,因为这是一个目录,而不是包含数据的文件。
您可以使用而不是调用外部实用程序shell 的内置参数扩展结构。
dir="131230_M01771_0032_000000000-A7874"
third_field="${dir#*_}"; third_field="${third_field#*_}"; third_field="${third_field%%_*}"
echo "$third_field"
答案2
既然您知道要操作的名称,为什么不将其传递给变量并将变量传递给cut
的 STDIN,您可以在 bash、ksh 或 zsh 中执行此操作:
% dir='140905_M01771_0112_000000000-ABBYT'
% cut -d_ -f3 <<<"$dir"
0112
或者,如果您知道目录名称至少有 3 个_
s 和 1 个-
,那么for
对名称进行简单的构造即可:
for dir in *_*_*_*-*; do cut -d_ -f3 <<<"$dir"; done
答案3
参数cut
是包含要剪切的信息的文件的名称,而不是实际信息。
如果您不传递除切割定义之外的任何参数,它将在其标准输入上查找要切割的信息。
因此,将信息通过管道传输到 cut 命令中更有意义。例如:
ls -1d -- *_*_*_* | cut -d _ -f 3
给定的ls
命令将列出具有给定名称模式的所有文件(包括目录),并且由此产生的文件列表将被该cut
命令剪切。
答案4
echo 140905_M01771_0112_000000000-ABBYT | cut -c 15,16,17,18