如何在单行上打印bash数组的输出

时间:2016-01-15 14:12:48

标签: arrays linux bash awk grep

我的代码是

arr=($(awk '/"*"/' output.txt)) 

并且output.txt说有以下内容 -

user  
{  
'xx123':  
comment
=>  
"John  
Smith",  
groups  
=>  
$groups,  
id  
=>  
'1234',  

这是搜索目标文件中的所有用户名。它会搜索数字arr中带引号和存储的所有内容。

当前输出:

"John  
Smith",  
"Abc  
Xyz",  
"...  
...",

但我想实现这个目标:

"John Smith"  
"Abc Xyz"

目前使用for循环打印此数据和另外两个数组。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

我正在对来自小样本的数据做出假设,但我们可以从这里开始,如果其中一些假设不太好,你可以告诉我。主要想法是在阅读带有开头引号的行后不打印新行:

$  awk '/^"/ { printf "%s ", $0; next } sub(/",$/, "\"")' output.txt
"John Smith"
"Abc Xyz"

$ cat output.txt
user
{
'xx123':
comment
=>
"John
Smith",
groups
=>
$groups,
id
=>
'1234',
=>
"Abc
Xyz",
groups
}

答案 1 :(得分:1)

虽然我同意awk解决方案可能是处理案例的最短方法,但使用bash内置比较,字符串索引和参数扩展(子字符串删除)也可以做到这一点。例如:

#!/bin/bash

first=""
while read -r last; do 
    [ "${last:0:1}" = '"' ] && first="$last"
    [ "${last:(-2)}" = '",' ] && printf "%s %s\n" "$first" "${last%,}"
done <"$1"

将为您的输入文件提供相同的输出,例如:

$ bash merge2l.sh file.txt
"John Smith"
"Abc Xyz"

答案 2 :(得分:0)

在我的第一次尝试中,我错过了你的观点。这是我的更正。

你可以试试这个:

printf "%s %s\n" "${arr[@]}"

示例:

$ set|grep BASH_VERSINFO
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")
$ printf "%s %s\n" "${BASH_VERSINFO[@]}"
3 2
25 1
release i686-redhat-linux-gnu

我希望这是你正在寻找的......

如果数组元素中没有空格,则可以使用${BASH_VERSINFO[@]}${BASH_VERSINFO[*]},但"${BASH_VERSINFO[@]}"更安全。

另一方面,最好在内部实施jas。如果您使用arr进行其他操作,那么这可能是一个合适的解决方案。

如果输入文件很小,可以在内实现。

我认为使用的模式"*"不是您想要使用的模式。此检查发现零{或}次"后跟"。我想您想查看".*""[^"]*"或类似的内容......