在目录中使用awk拆分文件夹名称

时间:2012-10-26 21:02:29

标签: linux bash awk

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

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 个答案:

答案 0 :(得分:2)

awk期望文件名作为输入。既然你说cas-2-32等是目录,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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

像这样执行

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

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

最小修复是使用here-string,它可以将变量的值提供给命令的stdin:

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

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

for file in *; do

答案 3 :(得分: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