bash: 用于过滤具有指定字符数的行的别名
bash: aliasing for filtering lines with specified character count
我想在 bash
CLI 上过滤具有用户提供的字符数的行。
虽然这可以通过 awk
完成(例如,| awk -F+ 'NF==7'
),但我想给它加上别名(比如 cfreq
),以便我可以按如下方式使用它:
$ cat foo | awk ' > 10' | cfreq 7 | wc
虽然命令可以通过一些简单的东西生成,例如 printf(例如,printf "awk -F+ NF==%s\n" 7
),但我无法通过 .bashrc
文件将它变成我可以跨多个系统使用的别名.任何帮助将不胜感激。
PS:虽然上述要求假设字符 +
是参考字符,但如果我也能概括它,它可能会更好。例如:
$ cat foo | awk ' > 10' | cfreq + 7 | wc
我不确定对别名的期望是否过高,尽管在某些情况下我已经能够为类似的任务设置别名。
使用函数代替别名:
cfreq() { local n=""; shift; awk -F'+' -v n="$n" 'NF==n' "${@:--}"; }
例如:
$ { printf '%s+' {1..8}; echo 9; } | cfreq 9
1+2+3+4+5+6+7+8+9
$ { printf '%s+' {1..8}; echo 9; } | cfreq 7
$
$ { printf '%s+' {1..8}; echo 9; } > file
$ cfreq 9 file
1+2+3+4+5+6+7+8+9
根据@EdMorton 的回答,我现在可以得到我需要的东西了。
在 .bashrc
中添加了 cfreq()
。然后它工作得很好!
$ cat test.txt
abc
abc + def
abc + def + ghi
abc + def + ghi
abc + ghi
$ cat test.txt | cfreq 2
abc + def
abc + ghi
$
我想在 bash
CLI 上过滤具有用户提供的字符数的行。
虽然这可以通过 awk
完成(例如,| awk -F+ 'NF==7'
),但我想给它加上别名(比如 cfreq
),以便我可以按如下方式使用它:
$ cat foo | awk ' > 10' | cfreq 7 | wc
虽然命令可以通过一些简单的东西生成,例如 printf(例如,printf "awk -F+ NF==%s\n" 7
),但我无法通过 .bashrc
文件将它变成我可以跨多个系统使用的别名.任何帮助将不胜感激。
PS:虽然上述要求假设字符 +
是参考字符,但如果我也能概括它,它可能会更好。例如:
$ cat foo | awk ' > 10' | cfreq + 7 | wc
我不确定对别名的期望是否过高,尽管在某些情况下我已经能够为类似的任务设置别名。
使用函数代替别名:
cfreq() { local n=""; shift; awk -F'+' -v n="$n" 'NF==n' "${@:--}"; }
例如:
$ { printf '%s+' {1..8}; echo 9; } | cfreq 9
1+2+3+4+5+6+7+8+9
$ { printf '%s+' {1..8}; echo 9; } | cfreq 7
$
$ { printf '%s+' {1..8}; echo 9; } > file
$ cfreq 9 file
1+2+3+4+5+6+7+8+9
根据@EdMorton 的回答,我现在可以得到我需要的东西了。
在 .bashrc
中添加了 cfreq()
。然后它工作得很好!
$ cat test.txt
abc
abc + def
abc + def + ghi
abc + def + ghi
abc + ghi
$ cat test.txt | cfreq 2
abc + def
abc + ghi
$