このコマンドが私に出力を提供しない理由を知っている人はいますか?すべての変数は正確ですが、結果はありません。
探す。 -name "$cdr_type*$DAYZ*.unl*" | xargs zcat | awk -F "|" '{if($14==$t日付&&$22==$misdn) $0}'|印刷 頭
このようなコマンドをエコーすると
echo "find . -name $cdr_type*$DAYZ*.unl* | xargs zcat | awk -F | '{if($14==$tdate && $22==$misdn) print $0}'|head"
これは私の結果です。
探す。 - 名前 mgr*20160928*.unl* | xargs zcat | awk-F | '{if(4==20160928093911 &&2==2348094398953)}'| 頭
私の観察によると、14ドルと22ドルの代わりに4ドルと2ドルが表示されます。
答え1
$14
ほとんどのBourne様シェルからシェルに拡張するのと同じですが、空であるか${1}4
設定$1
されていない場合は期待どおりに提供されます4
。ここでは、14番目のフィールドとして扱われるようにリテラルを渡そう$14
とします。awk
awk
一般的に、一重引用符の中には$1
変数は拡張されませんが、どのように拡張されるかはわかりませんでした。エコそのコマンド。
とにかく望ましい結果は次のとおりです。
find . -name "$cdr_type*$DAYZ*.unl*" -exec zcat {} + |
awk -F "|" -v tdate="$tdate" -v misdn="$misdn" '
$14 == tdate && $22 == misdn' |
head
つまり、シェル変数の内容を変数に$tdate
渡すことです。$misdn
awk