我有两个包含多行信息的变量,我想将它们列起来。
varA
返回
Aug 01
Aug 04
Aug 16
Aug 26
并varB
返回
04:25
07:28
03:39
10:06
如果我打印两个变量,它会返回
Aug01
Aug04
Aug16
Aug26
04:25
07:28
03:39
10:06
我想要做的事情如下:
Aug01 04:25
Aug04 07:28
Aug16 03:39
Aug26 10:06
我刚刚开始使用 Linux,希望得到一些建议。
答案1
Meetpaste
是预装的一部分GNU 核心实用程序:
$ paste <(printf %s "$varA") <(printf %s "$varB")
Aug 01 04:25
Aug 04 07:28
Aug 16 03:39
Aug 26 10:06
paste
以文件而不是变量作为输入,所以我使用bash
流程替代并使用 打印变量内容printf
。列之间的默认分隔符是TAB
,您可以使用选项更改它-d
,例如,更改paste -d" "
为单个空格字符。要了解更多信息,paste
请查看在线手册或运行info '(coreutils) paste invocation'
。
答案2
如果您只想并排显示文本变量,@dessert 有最简单(最佳?)的解决方案,使用print
。但是,如果您希望能够单独操作每个部分,您可以轻松地将变量转换为数组,然后循环遍历它。
#!/bin/bash
# declare the multi-line variables
var1="1
2
3
4"
var2="a
b
c
d"
# backup internal field separator to be safe
IFSave=$IFS
# set IFS to newline so vars will use newline to split into array
IFS=$'\n'
# split variables into array
foo=($var1)
bar=($var2)
#restore IFS to original value to be safe
IFS=$IFSave
# loop array foo, and cross reference key in array bar
for i in "${!foo[@]}"; do
printf "${foo[$i]} : ${bar[$i]}\n"
done
# you can allso now print single corresponding lines:
line=3
let id=$line-1 # arrays start at 0, so need to remove one
printf "\nPrinting line number $line\n"
printf "${foo[$id]} : ${bar[$id]}\n"
答案3
您可以使用 POSIX 工具执行此操作pr
:
varA='Aug 01
Aug 04
Aug 16
Aug 26'
varB='04:25
07:28
03:39
10:06'
pr -2 -t <<eof
$varA
$varB
eof
结果:
Aug 01 04:25
Aug 04 07:28
Aug 16 03:39
Aug 26 10:06
或者对于单个标签:
pr -2 -t -s
或者对于单个空格:
pr -2 -t -s' '
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pr.html
或者使用column
来自util-linux
包:
column -c 20 <<eof
$varA
$varB
eof
答案4
如果您想要避免使用外部实用程序并在 shell 中本地执行此操作,则可read
以为每个变量使用单独的文件描述符/字符串:
while IFS= read -r -u3 a && read -r -u4 b; do
printf '%s\t%s\n' "$a" "$b"
done 3<<<"$varA" 4<<<"$varB"
Aug 01 04:25
Aug 04 07:28
Aug 16 03:39
Aug 26 10:06
尽管使用 shell 进行文本处理通常被认为是不好的做法,但如果您已经在 shell 变量中拥有数据,那么这种做法可能是可以原谅的。