0

このテンプレートの作業ディレクトリにはいくつかのディレクトリがあります

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

ディレクトリ名をループして、フォルダ名の2番目と3番目の部分を取得したいと思います。私はこのスクリプトを書きました。体は私がやりたいことを示しています。しかし、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はファイル名を入力として期待します。etcはディレクトリであると言ったので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
于 2012-10-26T21:08:24.010 に答える
1

単純なコマンド:ls | awk'{FS = "-"; print $ 2 "" $ 3}'各行に値が必要な場合は、awkのprintのスペースの代わりに"\n"を追加するだけです。

于 2012-10-27T00:03:44.317 に答える
0

このように実行すると

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

awkの値自体$fileを解析するのではなく、の値を解析対象のファイルとして扱います。$file

最小限の修正は、変数の値をコマンドのstdinにフィードできる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 に答える