1

我编写了一个 shell 脚本来获取任何列。脚本是:

#!/bin/sh
awk '{print $c}' c=${1:-1}

所以我可以称之为

ls -l | column 2

但是我如何为多个列实现它?说,我想要类似的东西:

ls -l | column 2 3
4

3 回答 3

6

在这种情况下,我根本不会使用 awk:

columns() { tr -s '[:blank:]' ' ' | cut -d ' ' -f "$@"; }

这用于tr将所有空白序列压缩到一个空格,然后cut提取您感兴趣的字段。

ls -l | columns 1,5,9-

请注意,您不应该解析 ls 的输出

于 2013-07-26T13:46:30.713 回答
3
awk -v c="3,5" '
    BEGIN{ split(c,a,/[^[:digit:]]+/) }
    { for(i=1;i in a;i++) printf "%s%s", (i==1?"":OFS), $(a[i]); print "" }
'

Use any non-digit(s) you like as the column number separator (e.g. comma or space).

于 2013-07-26T13:59:50.107 回答
2
ls -l | nawk -v r="3,5" 'BEGIN{split(r,a,",")}{for(i in a)printf $a[i]" ";print "\n"}'

现在您可以简单地更改rshell 脚本中的变量并将其传递。或者你可以在你的 shell 脚本中配置它并使用r=$your_list_var

$your_list_varawk 命令将打印出现的任何字段编号。上面的示例打印输出的第 3 和第 5 个字段ls -l

于 2013-07-26T13:36:37.333 回答