
パイプで接続されたコマンドのエイリアスセットをバインドし、ここでいくつかのスレッドを調べた結果、cmd行を異なる方法で使用する必要があることがわかりました。 $1の代わりに!:1を使用しますが、次の状況では動作しないようです。
これはエイリアスを指定したい一連のコマンドです(中央値を計算します)。
shell> cat file_with_numbers| awk '{print $1}' | sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'
shell> 1.15
以下のセクションのエイリアスを「中央値」として指定したいと思います。
sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'
だから私は使用できます
shell> cat file_with_numbers| awk '{print $1}' | median
alias median 'sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }''
()位置が悪い。 //一重引用符エラー
alias median "sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'"
cat file| awk '{print $5}'| median
awk: { a[i++]=; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }
awk: ^ syntax error
\!:1
だから私は次に切り替えてみましたが、それでも機能しません。このエイリアスを正しく使用するにはどうすればよいですか?
1>テスト1
alias median "sort -n | awk ' { a[i++]=\!:1; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }' "
cat file| awk '{print $5}' | median
Bad ! arg selector.
2>テスト2
alias median "sort -n | awk ' { a[i++]=\\!:1; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }' "
cat file| awk '{print $5}' | median
awk: { a[i++]=!:1; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }
awk: ^ syntax error
テスト3>
答え1
一連の1行コマンドをエイリアスに入れることができますが、そこにバックスラッシュと一重引用符または二重引用符を追加する必要があるかもしれません。ただし、シェル履歴の引数または要素を使用してエイリアスを呼び出す必要がある場合や速度を最大化する必要がない場合は、コマンドシーケンスをそのままファイルに配置し、実行可能とマークされてからファイルに配置する方が簡単です。ファイルのどこかにあります。検索パス($PATH
または$path
)。
しかし、以下をエイリアスとして作成します。
sort -n | awk '{ a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'
あなたは確かにする必要があります
- パイプ演算子は引用符付き文字列内にあります。それ以外の場合、エイリアスコマンドは終了します。
- theは
$
一重引用符で囲まれた文字列の内側、またはaが前の引用符で囲まれた文字列の外側にあります\
(代替案を提供したStéphaneに感謝します)。 - 入れ子になった単一引用符なし
\!:1
プロダクションを試すために使用しないでください$1
。\!:1
パラメーターを別名に渡すと、そのパラメーターが使用されます。あなたは$1
awkがテキストを見ることを望みます。
この場合、最も安全な方法は、できるだけ多くのエイリアスを一重引用符で囲み、リテラルを囲むために"
一重引用符のみを使用することです。次の内容が2回表示されることがあります"'"
。
ubuntu% alias median 'sort -n | awk '"'"'{ a[i++]=$1 ; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }'"'"
ubuntu% seq 1 9 | median
5
答え2
車輪の再発明に興味がない場合は、GNUを使用することもできますdatamash
。
alias median 'datamash median 1'
datamash
タブで区切られた列は必須です。ただし、を使用して区切り記号を変更できます-t
。
特定の問題では、$parameter
(t)cshの拡張は二重引用符内で行われますが、Bourneなどのシェルとは異なりバックスラッシュで無効にすることはできないため、次のことが必要です。
alias median "sort -n | awk '{a[NR]="\$"1}; END {x = int(NR/2); print NR % 2 ? a[x+1] : (a[x]+a[x+1])/2}'"
$
つまり、asを入力するには二重引用符を削除する\$
か、Markのアプローチを使用して一重引用符を使用しますが、文字通り単一引用符を入力するには二重引用符を削除します。
答え3
この試み:
$ alias median="sort -n|awk ' { a[i++]="\$1"; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'"
$ cat file_with_numbers| awk '{print $1}'|median