我想创建一个别名以快速查看带有逗号分隔符的表格格式文件:
alias thead='head | cut -d, -f1- | column -s, -t'
Run Code Online (Sandbox Code Playgroud)
后来像这样使用它
thead file.csv
Run Code Online (Sandbox Code Playgroud)
但是,它不起作用。什么是正确的语法?
Kus*_*nda 10
对于比简单命令更高级的任何东西,请使用 shell 函数而不是别名:
thead () {
head -- "$1" | cut -d, -f1- | column -s, -t
}
Run Code Online (Sandbox Code Playgroud)
这个 shell 函数将head
在它的第一个参数上运行,然后通过管道发送结果(虽然,由于由于cut
获取所有列-f 1-
,这部分可能会被删除;我将它保留在这里,因为你在原始文件中拥有它管道)。
或者,
thead () {
head -- "$2" | cut -d "$1" -f1- | column -s "$1" -t
}
Run Code Online (Sandbox Code Playgroud)
... 能够将其用作
thead ',' filename
Run Code Online (Sandbox Code Playgroud)
甚至,为了允许可选的分隔符(如果没有给出,则使用逗号),
thead () {
local delim=','
if [ "$#" -gt 1 ]; then
delim=$1
shift
fi
head -- "$1" | cut -d "$delim" -f1- | column -s "$delim" -t
}
Run Code Online (Sandbox Code Playgroud)
上面的函数定义可以放在你通常定义别名的地方。
在别名中使用管道的问题在于,当您将别名与参数一起使用时,该参数将被添加到管道的末尾,而不是在管道中的第一个命令之后。
该bash
手册包含句子
对于几乎所有目的,别名都被 shell 函数取代。
Sté*_*las 10
alias
扩展只是由外壳再次解析的文本替换,因此当您执行以下操作时:
thead file.csv
Run Code Online (Sandbox Code Playgroud)
这只是替换为:
head | cut -d, -f1- | column -s, -t file.csv
Run Code Online (Sandbox Code Playgroud)
并再次解释。
如果你写过:
<file.csv thead
Run Code Online (Sandbox Code Playgroud)
或者
cat file.csv | thead
Run Code Online (Sandbox Code Playgroud)
或者
{ thead; } < file.csv
Run Code Online (Sandbox Code Playgroud)
它会起作用,因为它会被替换为:
<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
Run Code Online (Sandbox Code Playgroud)
分别。无论如何,正如@Kusalananda 所说,为此使用函数或脚本比使用别名要好得多。在这里,我只想做:
thead() { head "$@" | cut -d, -f1- | column -s, -t; }
Run Code Online (Sandbox Code Playgroud)
所以你可以做thead -n 12 file.csv file2.csv
例如。