BNa*_*irb 14 command-line bash text-processing
我有两个包含多行信息的变量,我想将它们列起来。
varA
返回
Aug 01
Aug 04
Aug 16
Aug 26
Run Code Online (Sandbox Code Playgroud)
并varB
返回
04:25
07:28
03:39
10:06
Run Code Online (Sandbox Code Playgroud)
如果我打印两个变量,它返回
Aug01
Aug04
Aug16
Aug26
04:25
07:28
03:39
10:06
Run Code Online (Sandbox Code Playgroud)
我想要做的是以下内容:
Aug01 04:25
Aug04 07:28
Aug16 03:39
Aug26 10:06
Run Code Online (Sandbox Code Playgroud)
我是使用 Linux 的新手,希望得到一些建议。
des*_*ert 23
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
Run Code Online (Sandbox Code Playgroud)
paste
将文件而不是变量作为输入,所以我使用了bash
Process Substitution并且只用printf
. 列之间的默认分隔符是TAB
,您可以使用-d
选项更改它,例如paste -d" "
单个空格字符。要了解更多信息,请paste
查看在线手册或运行info '(coreutils) paste invocation'
。
如果您只想简单地并排显示文本变量,@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"
Run Code Online (Sandbox Code Playgroud)