我想从数组中显示一长串字符串。
现在,我的脚本通过for循环运行,将每个值回显到标准输出:
for value in ${values[@]}
do
echo $value
done
是的,那太难看了!一栏列表也很长......
我想知道我是否可以找到命令或内置帮助我在列中显示所有这些值,例如ls
命令在列出目录(ls -C
)时默认执行。
[更新]
我的大脑失去了column
没有显示格式正确的列,这里有更多信息:
值:$ values=( 01----7 02----7 03-----8 04----7 05-----8 06-----8 07-----8 08-----8 09---6 10----7 11----7 12----7 13----7 14-----8 15-----8 16----7 17----7 18---6 19-----8 20-----8 21-----8)
(注意前两位数字作为索引,最后一位数字表示字符串长度以便于阅读)
命令:echo " ${values[@]/%/$'\n'}" | column
结果:bad columns http://tychostudios.ch/multipurpose/bad_columns.png
出了点问题......
答案 0 :(得分:17)
您可以将输出传输到column
。
column
似乎很难解决单列输入中的某些数据比tabstop(8个字符)更窄的问题。
在for
循环中使用printf
将值填充为8个字符似乎可以解决问题:
for value in "${values[@]}"; do
printf "%-8s\n" "${value}"
done | column
答案 1 :(得分:4)
以下是一些可以与Johnsyweb's answer一起使用的技术,因此您可以在没有循环的情况下完成输出:
saveIFS=$IFS
IFS=$'\n'
echo "${values[*]}" | column
IFS=$saveIFS
或
echo " ${arr[@]/%/$'\n'}" | column
或
echo " ${arr[@]/%/$'\n'}" | sed 's/^ //' | column
答案 2 :(得分:1)
看起来有些过分,但我提出了自己的解决方案。我编写了一个完全符合我想要的小脚本:获取值列表并在格式相当的列视图中输出它们。
答案 3 :(得分:1)
我知道这是一个老线程,但我从列中得到了不稳定的结果,所以我想我会给出我的解决方案。我想将每3行分成3个均匀间隔的列。
cat file.txt | xargs printf '%-24s\n' | sed '$p;N;s/\n//;$p;N;s/\n//'
基本上,它将每一行管道传输到printf中,然后将其左对齐成一个24个字符宽的空白块,然后通过管道传输到sed。 sed将展望未来2行并删除换行符。
N命令将下一行读入当前缓冲区,s / \ n //删除换行符。简而言之,我们想要的是'N; N; s / \ n // g',它在某些情况下会起作用。问题是,如果没有两个额外的行可以放入缓冲区,sed会突然退出。 $ p命令抢先说“如果这是最后一行,立即打印缓冲区内容”。
答案 4 :(得分:1)
我知道这是一个老线程,但我遇到了同样的情况。我最后结合了一些想法。
对于基于列实用程序的解决方案(没有初始空间问题):
(IFS=''; echo "${values[*]/%/$'\n'}") | column
使用@ Arko的脚本作为基础,这可以处理带空格的值。请注意左侧对齐列的% - * s的printf规范,右侧将删除“ - ”。我没有包括我的终端猜测,但它是可设置的(terminalWidth)。
# e.g. column "$@"
# spacing=4 column "$@"
# left=6 spacing=3 column "$@"
#
function column() {
local leftMargin=${left:-0}
local padding=${spacing:-2}
local maxWidth=$(( ${terminalWidth:-80} - $leftMargin ))
local values=("$@")
local max=$(( $(IFS=''; echo "${values[*]/%/$'\n'}" | wc -L) + $padding ))
local cols=$(( $maxWidth / $max ))
local pos=0 NL=''
for value in "${values[@]}"; do
[[ $pos == 0 ]] && {
printf "$NL%*s" "$leftMargin"
NL=$'\n' # add newlines from now on...
}
printf "%-*s" "$max" "$value"
(( pos = ($pos + 1) % $cols ))
done
echo
}
答案 5 :(得分:1)
出于某种原因,ReactDOM.render((
<Router history={browserHistory}>
<Route path="/" component={Login}/>
<Route path="main" component={main}>
<IndexRoute component={Home} />
<Route path = "/Accession" component = {Home} />
<Route path="/contact" component={Contact}/>
</Route>
</Router>
), document.getElementById('App'));
对我不起作用。在我的情况下,我有一个类似
column
而不是我用
$ array = ( 1 2 3 dir1 dir2 dir3 )
$
$ echo ${array[@]} | column
1 2 3 dir1 dir2 dir3
答案 6 :(得分:0)
在每个值后使用标签。
(它也自动流向下一行......)
for value in ${values[@]}
do
echo -en "$value\t"
done
详细信息 here
古德勒克!!
- CVS