在管道中将 grep 输出从行格式转换为列格式

在管道中将 grep 输出从行格式转换为列格式

我正在使用一个名为“dsk”的程序来运行分析。我只对分析的几行感兴趣,并使用以下内容来检索这些行:

dsk -file <filename> | grep -Ei 'string1|string2|string3'

这给了我类似的东西:

string1                                : 13
string2                                : 46
string3                                : 39

*编辑:重新格式化以更真实地输出(不受制表符限制,有 32 个空格、一个冒号以及字段之间的另一个空格)

但是,我希望输出看起来像这样:

string1 string2 string3
13      46      39

格伦提供的答案生成以下内容,可能是因为空格引起了混乱:

string1 string2 string3
:   :   :

答案1

使用代替

dsk -file "$file" | awk '
    tolower($1) ~ /string1|string2|string3/ { n++; vars[n] = $1; vals[n] = $2 }
    END {
        for (i = 1; i <= n; i++) printf "%s\t", vars[i]
        print ""
        for (i = 1; i <= n; i++) printf "%s\t", vals[i]
        print ""
    }
'

答案2

@SteelDriver 链接的答案中提到的通用工具非常合适,@glenn jackman 的答案也是如此。

但是,如果您的数据格式如您所指示的那样简单 - 也就是说,如果片段中没有空格string1 .. stringN- 那么以读取输入文件两次为代价,您也可以这样做:

dsk -file <filename> | grep -Ei 'string1|string2|string3' > tempfile.txt

readarray labels < <(awk '{print $1}' tempfile.txt)
readarray values < <(awk '{print $2}' tempfile.txt)

printf '%s\t' ${labels[@]}
printf '\n'

printf '%s\t' ${values[@]}
printf '\n'

这种格式可能有点简单,特别是可能无法像您希望的那样很好地对齐条目。但如果您需要的只是制表符分隔的输出,它就会这样做。

相关内容