ヘッドとカットを用いたエイリアスパイプ

ヘッドとカットを用いたエイリアスパイプ

カンマ区切り文字を含むテーブル形式のファイルをすばやく表示するためにエイリアスを作成したいと思います。

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これを行うことができます。

関連情報