0

使用此模板的工作目录中有一些目录

cas-2-32
sat-4-64  
...

我想遍历目录名称并获取文件夹名称的第二部分和第三部分。我写了这个脚本。身体显示我想做什么。但是 awk 命令似乎是错误的

#!/bin/bash
for file in `ls`; do
  if [  -d $file ]; then 
    arg2=`awk -F "-" '{print $2}' $file`
    echo $arg2
    arg3=`awk -F "-" '{print $3}' $file`
    echo $arg3
  fi
done

但它说

 awk: cmd. line:1: fatal: cannot open file `cas-2-32' for reading (Invalid argument)
4

4 回答 4

2

awk 需要一个文件名作为输入。既然你说cas-2-32etc 是目录,awk 出于同样的原因失败。

使用 echo 将目录名称提供给 awk:

#!/bin/bash
for file in `ls`; do
  if [  -d $file ]; then 
    arg2=$(echo $file | awk -F "-" '{print $2}')
    echo $arg2
    arg3=$(echo $file | awk -F "-" '{print $3}')
    echo $arg3
  fi
done
于 2012-10-26T21:08:24.010 回答
1

简单命令:ls | awk '{ FS="-"; print $2" "$3 }' 如果你想要每一行中的值,只需在 awk 的打印中添加 "\n" 而不是空格。

于 2012-10-27T00:03:44.317 回答
0

像这样执行时

awk -F "-" '{print $2}' $file

awk$file's 的值视为要解析的文件,而不是解析$file's 的值本身。

最小的解决方法是使用一个here-string,它可以将变量的值输入到命令的标准输入中:

awk -F "-" '{print $2}' <<< $file

ls顺便说一句,如果您只想要当前目录中的文件列表,则不需要,请*改用,即

for file in *; do
于 2012-10-27T02:55:01.137 回答
0

单程:

#!/bin/bash
for file in *; do
  if [ -d $file ]; then
    tmp="${file#*-}"
    arg2="${tmp%-*}"
    arg3="${tmp#*-}"
    echo "$arg2"
    echo "$arg3"
  fi
done

另一个:

#!/bin/bash
IFS="-"
for file in *; do
  if [ -d $file ]; then
    set -- $file
    arg2="$2"
    arg3="$3"
    echo "$arg2"
    echo "$arg3"
  fi
done
于 2012-10-27T05:05:37.567 回答