単純な awk ラッパー関数またはエイリアス

単純な awk ラッパー関数またはエイリアス

私は人々がbashエイリアスやawkベースの関数を使用しているのを見て、その単純さが好きですが(bashで)それを実装する方法を覚えていません。

列3、4、7を選択する必要がある大きな形式のファイルがあるとします。

これを行うには、次のようにします。

cat bigfile.txt | awk '{print $3, $4, $7}' |less

次のように使用できるエイリアス(または関数)Pawkが必要です。

cat bigfile.txt | pawk 3,4,7 | less

同じ効果を得るために。列数は任意で、NFを含めることができます。これを達成するためにいくつかの方法を試しましたが、任意の数の変数をawkに渡す方法はわかりません。

答え1

次の機能を使用できます。

function pawk(){
  awkString="{print "

  for var in "$@"
  do
    awkString+=" \$$var"
  done

  awkString+=" }"

  awk "$awkString"
}

例:

cat bigfile.txt | pawk 3 4 7 | less

答え2

はい、おそらくエイリアスではない関数です。これを念頭に置いて、次のことを試してください。

pawk(){
    fields="$(sed -E 's/(^|,)/ \1\$/g'<<<"$1")"
    shift
    awk "{print $fields}" "$@"
}

その後、実行できます。

pawk 3,4,7 bigfile.txt | less

または

cat bigfile | pawk 3,4,7 | less

でも

pawk 3,4,7 * | less

ヒントは、$各コンマの前と関数の最初のパラメータの先頭にaを追加し(つまり、)、1,2,3結果$1,$2,$3文字列をシェル変数に格納することです。その後、変数を拡張して印刷する必要があるフィールドとして扱うように二重引用awk符で囲むことができます。$fieldsawk

移植性はかなり高くなければsed -Eなりませんが、herestring(<<<"$1")は移植性が低下します。完全に移植可能なバージョンの場合は、次を使用します。

pawk(){
    fields="$(printf '$%s' $(echo 1,2,3 | sed 's/,/,\$/g'))"
    shift
    awk "{print $fields}" "$@"
}

関連情報