工作目录中有一些带有此模板的目录
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)
答案 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