3

私はこのような文字列を持っています

/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt
/home/rm/home-scripts/originals/audicerttest2/incoming/TEST040512.txt
/home/rm/home-scripts/originals/audicerttest3/incoming/TEST040513.txt

など..文字列「audicerttest/incoming」、「audicerttest2/incoming」などをシェル変数に抽出し、後でスクリプトで使用したいと考えています。私はこのようなものを試しました。

for file in `find ${ROOT}/* -type f | grep -v -f test.txt`
do
let count++
echo ${count}: ${file}
echo ${file} | eval $(awk '{split($0,a,"/"); print "abc=a[6]/a[7]"}' < /dev/null)
echo abc====$abc
done

しかし、abcの出力はありません。

4

5 に答える 5

7

課題はたくさんありますが、問題を切り分けて一つ一つ解決していきましょう。

指定- 生の文字列:

/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt

望ましい出力- この部分を変数に保存したい:

audicerttest/incoming

ハウツー- これはそれを行います:

string="/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt"
parsed=$(awk 'BEGIN{FS=OFS="/"} {print $6, $7}' <<< ${string})

一般に、次のファイルがあるとしますinput_file.txt

/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt
/home/rm/home-scripts/originals/audicerttest2/incoming/TEST040512.txt
/home/rm/home-scripts/originals/audicerttest3/incoming/TEST040513.txt

できるよ:

awk 'BEGIN{FS=OFS="/"} {print $6, $7}' input_file.txt > parsed_vars.txt

そしてparsed_vars.txt含まれます:

audicerttest/incoming
audicerttest2/incoming
audicerttest3/incoming

いくつかの説明:

  • parsed=$(...)stdout- サブシェルを生成し、出力をそのサブシェル内の変数に保存しますparsed
  • awk 'BEGIN{FS=OFS="/"}-入力と出力の両方について、awk区切り文字を呼び出して設定します。/
  • {print $6, $7}'- 生の文字列の形式に基づいて、6 番目 (audicerttest) と 7 番目 (着信) フィールドを出力します。
  • <<< ${string}herestringを使用するための表記法です
  • input_file.txt > parsed_vars.txt- 指定された入力ファイルから読み取り、出力を出力ファイルにリダイレクトします。
于 2012-11-29T20:37:32.037 に答える
2

awkこれは、オーバーキルを使用せず、悪evalを使用せず、サブシェルを使用しない、純粋なbashソリューションです。

次の文字列があります。

string="/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt"

/variableの 5 番目と 6 番目のフィールド (separation は ) を含む文字列が必要ですparsed。さあ行こう:

IFS=/ a=( $string ) printf -v parsed '%s/%s' "${a[@]:5:2}"
于 2012-11-29T20:59:02.020 に答える
1

bash 配列のみを使用すると、次のことができます。

仮定:

path=/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt

それで:

IFS=/ split=(${path})
path_part="${split[5]}/${split[6]}"

$split要素0が空、要素1 home、要素2rmなどの配列になります。これで、好きな部分を取得したい要素を連結するだけで済みます。

于 2012-11-29T20:59:21.430 に答える
1
echo ${file} | eval $(awk '{split($0,a,"/"); print "abc=a[6]/a[7]"}' < /dev/null)

さて、ここでいくつかの問題があります。

awkから読み取って/dev/nullいますが、意味がありません。ファイル名を処理したいと思います。

echo {$file} | awk ... 

"a[6]"は文字列a[6]です。置換は行われません。

すべてを評価します。

eval $(echo $file | awk '{split($0,a,"/"); print "abc="a[6]"/"a[7]""}')

最後に、eval は悪です。変数を直接設定してみませんか?

abc=$(echo $file | awk '{split($0,a,"/"); print a[6]"/"a[7]}')

個人的には、これはもう少し明確です。

 cut -d / --output-delimiter / -f6,7
于 2012-11-29T20:35:43.673 に答える
0

Nobody has suggested simple parameter expansion to manipulate the strings. I'm assuming that the first 4 directories are constant

while read path; do
    dirname=$(dirname $path)
    abc=${dirname#/home/rm/home-scripts/originals/}
    echo "abc===$abc"
done < filename
于 2012-11-30T01:29:48.230 に答える