如何剪切目录名的字段?

如何剪切目录名的字段?

我有一个名为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

相关内容