私は人々が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
符で囲むことができます。$fields
awk
移植性はかなり高くなければsed -E
なりませんが、herestring(<<<"$1"
)は移植性が低下します。完全に移植可能なバージョンの場合は、次を使用します。
pawk(){
fields="$(printf '$%s' $(echo 1,2,3 | sed 's/,/,\$/g'))"
shift
awk "{print $fields}" "$@"
}