如何在bash的并排列中打​​印多行变量?


12

我有两个包含多行信息的变量,我想对它们进行列。

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的新手,我将不胜感激。


请包括您尝试打印两个变量时使用的bash代码。这样我们就可以看到您在尝试中做错了什么。
伯纳德·魏

Answers:


22

Meet paste,是预安装的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将文件而不是变量作为输入,因此我使用了bashProcess Substitution并仅使用来打印变量内容printf。列之间的默认定界符是TAB,您可以使用-d选项更改该定界符,例如paste -d" "单个空格字符。要了解更多信息,请paste查看在线手册或运行info '(coreutils) paste invocation'


1
@BNairb如果此答案解决了您的问题,请花一点时间并单击左侧的复选标记以接受它。这会将问题标记为已回答,并且是在Stack Exchange网站上表达感谢的方式。
甜点

7

如果您只是想简单地并排显示文本变量,则@dessert具有使用的最简单(最佳?)解决方案print。但是,如果您希望能够分别操作每个片段,则可以轻松地将vars转换为数组,然后循环遍历。

#!/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

如果您想避免使用外部实用程序,而直接在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变量中包含了数据,则可能会为您辩解。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.