如何将 AWK 应用到目录路径?

如何将 AWK 应用到目录路径?

我有这个命令:

Folder=./GAS/NNN_/Neutral
awk -F / '{print $(NF-1)}' $Folder

但我得到了:awk: read error (Is a directory)

我努力了:

awk -F / '{print $(NF-1)}' $(Folder)
awk -F / '{print $(NF-1)}' $($Folder)
awk -F / '{print $(NF-1)}' $(echo $Folder)

我得到了同样的答复。

答案1

awk 的语法是 或awk 'awk script' input_fileinput_stream | awk 'awk script'您尝试将变量作为文件名传递,并且由于变量的值是目录,因此 awk 尝试将该目录作为文件打开并失败。

因此,您要么需要打印出该值,然后将其传递给awk(参见为什么 printf 比 echo 更好?我在这里使用的原因printf):

$ printf '%s\n' "$Folder" | awk -F / '{print $(NF-1)}'
NNN_

或者你可以使用这里是字符串

$ awk -F / '{print $(NF-1)}' <<< "$Folder"
NNN_

答案2

使用任何 awk:

awk -F / 'BEGIN{ print a[split(ARGV[1],a)-1]; exit }' "$Folder"

将参数拆分为 awk 而不是将输入拆分为 awk 将避免对其他命令、管道和/或临时文件(例如<<<可能会创建的)的需求。

仅供参考,您不需要 awk 或任何其他外部命令来实现此目的,例如使用 bash 您可以执行以下任一操作或类似操作:

  1. tmpStr="${Folder%/*}"; printf '%s\n' "${tmpStr##*/}"
  2. [[ $Folder =~ .*/([^/]*)/ ]] && printf '%s\n' "${BASH_REMATCH[1]}"
  3. IFS=/ read -ra tmpArr <<< "$Folder"; printf '%s\n' "${tmpArr[-2]}"
  4. ( set -f; IFS=/; tmpArr=( $Folder ); printf '%s\n' "${tmpArr[-2]}" )

我将最后一个放在子 shell 中,这样您就不必记住您的set [-+]f和/或IFS设置以便在执行命令后恢复它们,但您也可以假设您有set +f(默认)并在当前 shell 中执行此操作(如果您愿意,可以将其全部放在一行上):

set -f; oIFS="$IFS"; IFS='/';
tmpArr=( $Folder ); printf '%s\n' "${tmpArr[-2]}";
IFS="$oIFS"; set +f

相关内容