Bash:根据命令添加列

时间:2016-09-26 16:53:41

标签: bash

在Bash中,是否有一种简单的方法来获取列,对值运行bash命令,然后将结果作为新列附加?

作为一个简单(并且做作)的例子,假设我想要一个当前目录中的符号链接列表以及它们指向的目标。 awk等价物可能是这样的:

ls | awk '{ "readlink -f "$1 | getline target; print $1, target }'

但那是满口的。我更愿意为此任务明确地使用工具设计。类似xargs的东西:

ls | add-column readlink -f

输出结果为:

A.txt /path/to/A.txt
B.txt /path/to/B.txt

这样的工具是否存在?

2 个答案:

答案 0 :(得分:1)

轻松完成,虽然名称使用下划线而不是短划线更安全(relevant POSIX standard仅保证“支持便携式字符集中的下划线,数字和字母”in function names ):

add_column() {
  while IFS= read -r line; do
    printf '%s\t%s\n' "$line" "$("$@" "$line")"
  done
}

ls -1 | add_column readlink -f --

请注意output of ls is not suitable for programmatic use,所以这个特殊的例子应该只是一个例子。

答案 1 :(得分:0)

如何使用简单的while循环:

find -mindepth 1 -maxdepth 1 -type l -print0 |
    while IFS= read -r -d '' file; do
        printf "%s\t%s\n" "$file" "$(readlink -- "$file")"
    done | column -t -s $'\t'

注意我使用的是find而不是ls,因为它有-print0可以使用换行符处理文件名。此外,如果任何符号链接或其任何目标包含选项卡,则不会产生正确的输出格式。