如何将行输出到一个由 space (bash) 分隔的字符串中

How to output lines into one string separated by space (bash)

我在Bash

中有这个结构
while read line
do
    echo $line | while read  a b c d e f g
    do
        if [ $e != "0" ]; then
        echo -en "|'$a'=;$g;$f;;"
        fi
    done
done < /tmp/res6

这篇文字是哪只猫

mem_total_app_1 5034876928  + 384000 = 5035260928       mysqld
mem_total_app_2 2994008064  + 108532736 = 3102540800    /usr/sbin/amavi(91)
mem_total_app_3 648744960  + 103424 = 648848384 redis-server
mem_total_app_4 541454336  + 58354688 = 599809024       php-fpm7.2(26)

并输出到这里

|'mem_total_app_1'=;mysqld;5035260928;;
|'mem_total_app_2'=;/usr/sbin/amavi(91);3102540800;;
|'mem_total_app_3'=;redis-server;648848384;;
|'mem_total_app_4'=;php-fpm7.2(26);599809024;;

我希望在一个字符串中以 space 分隔输出。像这样

|'mem_total_app_1'=;mysqld;5035260928;; 'mem_total_app_2'=;amavi(91);3102540800;; 'mem_total_app_3'=;redis-server;648848384;; 'mem_total_app_4'=;php-fpm7.2(26);599809024;;

有人可以提示我吗?

只需将换行符替换为 space:

tr '\n' ' ' < input_filename

这可能不是最漂亮的方式,但您可以像这样将整个循环传送到 tr

{
    while read line
    do
        echo $line | while read  a b c d e f g
        do
            if [ $e != "0" ]; then
            echo -en "|'$a'=;$g;$f;;"
            fi
        done
    done < /tmp/res6
} | tr '\n' ' '

(注意小胡子括号周围的空格。)

尝试prinft 命令

printf命令提供了一种打印预格式化文本的方法,类似于printf()系统接口(C函数).它的意思是 successor for echo,并且具有 更多的功能和可能性

printf "|"
while read line
do
    echo $line | while read  a b c d e f g
    do
        if [ $e != "0" ]; then
        printf " '$a'=;$g;$f;;"
        fi
    done
done  < /tmp/res6

输出:-

| 'mem_total_app_1'=;mysqld;5035260928;; 'mem_total_app_2'=;/usr/sbin/amavi(91);3102540800;; 'mem_total_app_3'=;redis-server;648848384;; 'mem_total_app_4'=;php-fpm7.2(26);599809024;;

tr '\n' ' ' 是一个不错的方法,但是如果你想避免在最后出现 space,请使用

<input_file paste -sd' '

这很方便,例如用 bc:

进行计算
<one_number_on_line paste -sd+ | bc

为您提供所有行的总和(每行一个数字)。

如果可以使用awk:

awk 'BEGIN{OFS=";";ORS=";; ";printf "|"}{print "7""7",$NF,$(NF-1)}' file

脚本设置输出分隔符 OFSORS 以便它可以使用 ; 打印内容。请注意,7 是单引号字符。