0

何らかの理由で、このスクリプトから「-bash」が出力されていることを理解しようとしています。

cat sample | awk -v al=$0 -F"|" '{n = split(al, a, "|")} {print a[1]}'

「サンプル」ファイルには、a|b|c|d|e|f|d のような psv の「パイプ区切り値」が含まれています。
私の意図は、配列を使用することです。
上記のスクリプトの結果は、長さ 1 の配列であり、含まれる唯一の項目はシェルの名前である「-bash」です。
デフォルトでは $0 は現在使用されているプログラムを指していますが、私の知る限り、 awk スクリプト内では、 $0 パラメータは読み取られている行全体を指す必要があります。

問題の正確な場所が「bash/awk は初めて」ということを理解したいので、次の手順のどれが失敗しているか教えていただけますか?
1-サンプル ファイルを「連結」し、awk スクリプトの入力として渡します
2-「サンプル」に含まれる各行を値として「al」という名前の変数を定義します
3-パイプ「|」を定義します フィールドセパレーターとして
4-アクションを定義し、スプリッターとしてパイプを使用して「al」の値を「a」という名前の配列に分割します
5-別のアクションを定義します。この場合、配列の最初のアイテムを単に出力します

何かアドバイス?ありがとう!

4

3 に答える 3

2

は、$0実行前にシェルによって展開されます。は現在のプログラムの名前です。開始時の は、login(1)によって bash が実行されたためです(組み込みの の説明を参照してください) 。awk$0bash-execman bash

$0シェルがそれを展開しないように引用する必要があり、 awk はそれを見ます:

awk -v 'al=$0' -F"|" '{n = split(al, a, "|")} {print a[1]}' sample

ただし、変数の割り当てはデータを読み取る前にal処理されるため、変数はプログラムの開始時に文字列 "$0" に設定され、各入力レコードの内容には設定されません。al

レコードが必要な場合は、変数を使用する代わりにそう言ってください:

awk -F"|" '{n = split($0, a, "|")} {print a[1]}' sample
于 2012-09-30T22:27:25.067 に答える
1

によって、現在のプログラムの名前である bash に-v a1=$0設定されます。man bashの引数a1参照してください。

于 2012-09-30T19:24:54.293 に答える
0

エラー...

awk -F'|' '{ print $1 }' sample
于 2012-09-30T19:24:41.127 に答える