カンマ区切り文字を含むテーブル形式のファイルをすばやく表示するためにエイリアスを作成したいと思います。
alias thead='head | cut -d, -f1- | column -s, -t'
後でこのように使用される
thead file.csv
しかし、これはうまくいきません。正しい構文は何ですか?
答え1
単純なコマンドよりも高度な機能を使用するには、エイリアスの代わりにシェル関数を使用してください。
thead () {
head -- "$1" | cut -d, -f1- | column -s, -t
}
このシェル関数はhead
最初の引数で実行され、パイプを介して結果を送信しますcut
。みんなこの部分は熱によって除去することができます-f 1-
。もともとパイプラインでしたようにここに残しました。
または、
thead () {
head -- "$2" | cut -d "$1" -f1- | column -s "$1" -t
}
...次のように使用できます。
thead ',' filename
それとも許可任意に選択できる区切り記号(提供されていない場合はカンマが使用されます)
thead () {
local delim=','
if [ "$#" -gt 1 ]; then
delim=$1
shift
fi
head -- "$1" | cut -d "$delim" -f1- | column -s "$delim" -t
}
上記の関数定義は通常、エイリアスを定義する任意の場所に配置できます。
エイリアスにパイプを使用する場合の問題は、パラメータと一緒にエイリアスを使用するときに、パラメータがパイプの最初のコマンドの後にではなくパイプの末尾に追加されることです。
マニュアルbash
にはこのような文があります
ほとんどすべての目的で、エイリアスはシェル関数に置き換えられます。
答え2
alias
拡張は単なるテキスト置換であり、シェルによって再解析されます。したがって、次のことを行うとき:
thead file.csv
ちょうど次に置き換えられました。
head | cut -d, -f1- | column -s, -t file.csv
そしてまた説明しました。
あなたが書いている場合:
<file.csv thead
または
cat file.csv | thead
または
{ thead; } < file.csv
次に置き換えられるので動作します。
<file.csv head | cut -d, -f1- | column -s, -t
cat file.csv | head | cut -d, -f1- | column -s, -t
{ head | cut -d, -f1- | column -s, -t; } < file.csv
それぞれ。とにかく@Kusalanandaが言ったように、関数やスクリプトを使用する方がエイリアスを使用するよりもはるかに優れています。ここでは、次のことをしたいと思います。
thead() { head "$@" | cut -d, -f1- | column -s, -t; }
だからあなたはthead -n 12 file.csv file2.csv
これを行うことができます。