2

AWK を使用して 2 つの分割を実行したいと思います (2 つのフィールド区切りがあります)。作業中のデータの文字列は次のようになります。

data;digit&int&string&int&digit;data;digit&int&string&int&digit

ご覧のとおり、外側のフィールド区切りはセミコロンで、ネストされた区切りはアンパサンドです。私が awk でやっていることは (文字列が test という名前の変数にあると仮定します)

echo ${test} | awk '{FS=";"} {print $2}' | awk '{FS="&"} {print $3}'

これは「文字列」という単語をキャッチするはずですが、何らかの理由でこれが機能していません。最初の awk 関数の結果しか表示されないため、2 番目のパイプが適用されていないようです 何かアドバイスはありますか?

4

3 に答える 3

5

awk 配列を使用する

echo $test | awk -F';' '{split($2, arr, "&"); print(arr[3])}'
于 2012-10-12T15:12:16.800 に答える
4

他の回答は実用的な解決策を提供しますが、実際には問題を説明していません。

問題は、スクリプトがFS通常{ ... }のブロック内に設定しても、現在の行に対して、などが再計算されないことです。そのため、後の行には設定されますが、最初の行はすでに空白で分割されています。スクリプトを実行する前に設定するには、ブロック (最初の行の前に実行される) を使用できます。または、コマンドライン オプションを使用できます。awk$1$2FSFSBEGIN-F

これらの変更のいずれかを行うと、コマンドが修正されます。

echo "$test" | awk 'BEGIN{FS=";"} {print $2}' | awk 'BEGIN{FS="&"} {print $3}'
echo "$test" | awk -F';' '{print $2}' | awk -F'&' '{print $3}'

(引用符で囲まれていないパラメーター展開はトラブルのレシピであるため、私は自由$testに二重引用符で囲むこともしました。あなたの値では問題ありませんでしたが、念のため、常に二重引用符を使用$testすることを習慣にしています.)

于 2012-10-12T15:15:21.713 に答える
3

それを試してください:

echo "$test" | awk -F'[;&]' '{print $4}'

複数のセパレータを指定します-F'[;&]'

于 2012-10-12T15:09:50.537 に答える