【问题标题】:How to printf text with spaces as same line如何打印带有空格的文本作为同一行
【发布时间】:2020-09-09 07:00:03
【问题描述】:

我有这样的文本文件

B.10967 2020-09-09 12:01:58.913
B.10966 2020-09-09 12:01:51.670
B.10965 2020-09-09 12:01:24.070

然后我有一些用于循环的 shell 脚本,然后是循环结果中的 printf

pathlastsfcola="/media/LastPatch.txt";
for codes in $(cat $pathlastsfcola | tr -d '\r')
do
   printf "${codes}\n"
done;

然后循环的结果是这样的

B.10967
2020-09-09
12:01:58.913
B.10966
2020-09-09 
12:01:51.670
B.10965 
2020-09-09 
12:01:24.070

我的预期结果还是这样

=================================
|code   | date time             |
=================================
|B.10967|2020-09-09 12:01:58.913|
|B.10966|2020-09-09 12:01:51.670|
|B.10965|2020-09-09 12:01:24.070|
=================================

如何打印每个数据以空格为分隔符

【问题讨论】:

  • 抱歉,如果我在这里遗漏了什么,但您的示例输入和示例预期输出看起来相同,请您详细说明一下。
  • 对不起,我的意思是我需要用空格作为分隔符打印每个数据,比如第一行有 3 列

标签: linux shell loops awk printf


【解决方案1】:

您能否尝试以下,在所示示例中使用 GNU awk 编写测试。

awk -v header_footer="=================================" '
BEGIN{
  OFS="|"
  print header_footer ORS "|code   | date time             |"
}
{
  print "",substr($0,1,length($1)),substr($0,length($1)+2),""
}
END{
  print header_footer
}' Input_file

输出如下。

=================================
|code   | date time             |
|B.10967|2020-09-09 12:01:58.913|
|B.10966|2020-09-09 12:01:51.670|
|B.10965|2020-09-09 12:01:24.070|
=================================

【讨论】:

    【解决方案2】:

    你可以试试这样的

    input="/media/LastPatch.txt"
    while IFS= read -r line
    do
      printf "$line\n"
    done < "$input"
    

    我在 ubuntu 上试过,效果很好

    我从这里得到了这个例子:https://www.cyberciti.biz/faq/unix-howto-read-line-by-line-from-file/

    【讨论】:

    • 不要使用printf "$line\n",而是使用printf '%s\n' "$line"。当$line 包含 printf 格式化字符等时,前者会失败。你根本不应该为此使用 shell 循环,因为即使在最好的情况下它也会非常慢。
    【解决方案3】:

    您需要做的只是引用您的变量,如下所示。所发生的只是$pathlastsfcola 变成了"$pathlastsfcola"

    for codes in "$pathlastsfcola"
    do
       printf "${codes}\n"
    done;
    

    查看这里的解释:

    https://tldp.org/LDP/abs/html/quotingvar.html

    【讨论】:

    • 不,这将打印输入文件的名称。另见stackoverflow.com/questions/63806328/…
    • 是的。我认为pathlastsfcola=$( cat "/media/LastPatch.txt" ); 是作者的意思。应该在回复之前检查一下。
    猜你喜欢
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2012-09-09
    • 2016-09-28
    • 2015-06-19
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    相关资源
    最近更新 更多