【问题标题】:Print out four lines side by side, then start over并排打印四行,然后重新开始
【发布时间】:2017-03-26 09:15:04
【问题描述】:

我有一个文件

6/28
Save As You Go Transfer Credit From Xxxxxxxxxxx3495
1.00
10.00
7/7
Save As You Go Transfer Credit From Xxxxxxxxxxx3495
1.00
11.00
7/8
Save As You Go Transfer Credit From Xxxxxxxxxxx3495
1.00
12.00
7/12
Save As You Go Transfer Credit From Xxxxxxxxxxx3495
1.00
13.00

我想像$line $line $line $line 一样打印它,然后每四行打印一次,然后开始一个新行。我认为循环是要走的路 - 但它不起作用

#!/bin/bash

while read line
do
for ((i=0; i<3 ; i++;))
do
echo $line | tr "\n" " "

done
i=0
done < /tmp/moo.txt

这就是我想要的文件打印方式:

6/28 Save As You Go Transfer Credit From Xxxxxxxxxxx3495 1.00 10.00
7/7 Save As You Go Transfer Credit From Xxxxxxxxxxx3495 1.00 11.00
7/8 Save As You Go Transfer Credit From Xxxxxxxxxxx3495 1.00 12.00
7/12 Save As You Go Transfer Credit From Xxxxxxxxxxx3495 1.00 13.00

~

【问题讨论】:

    标签: bash loops while-loop


    【解决方案1】:

    由于N mod 4[0;3] 范围内周期性变化:1, 2, 3, 0, 1, 2, 3, 0, 1, ...,您可以测试模运算的结果是否为零,如果是则打印换行符:

    i=0
    while read line
    do
      printf '%s ' "$line"
      (( ++i % 4 )) || printf '\n'
    done < /tmp/moo.txt
    

    在此示例中,printf 打印文件的下一行,并附加空格 (%s)。 %s 格式规范代表字符串(第一个参数是格式字符串,后面的参数根据格式字符串传递)。

    表达式(( ++i % 4 )) 是一个arithmetic expansion,它将i 变量加1,然后执行模4 运算。注意 pre-increment 操作符的使用。

    在算术上下文中,零被解释为布尔值false。如果由于 OR operator || 而算术运算的结果为零,则执行 printf '\n' 命令。为了清楚起见,一些示例:

    (( 0 )) || echo zero
    (( 1 )) && echo non-zero || echo zero 
    

    输出

    zero
    non-zero
    

    通过添加一些额外的逻辑很容易修复尾随空格(就在换行符之前):

    i=0
    while read line
    do
      (( ++i % 4 )) && d=' ' || d=$'\n'
      printf '%s%s' "$line" "$d"
    done < /tmp/moo.txt
    

    注意ANSI C-quoting 用于换行符:$'\n'

    同样使用 AWK

    可以使用 AWK 实用程序实现相同的逻辑:

    awk '{ printf "%s%s", $0, (NR % 4 ? " " : "\n") }' /tmp/moo.txt
    

    我们使用了AWK's conditional expressionbuilt-in auto-set NR 变量。

    附言

    为什么是printfThere are serious reasons 使用 printf 而不是 echo

    【讨论】:

    • 打印的'%s'是什么
    • 这是什么意思(白话) (( ++i % 4 )) || printf '\n'
    【解决方案2】:

    尝试:

    #!/bin/bash
    
    while read line
    do
    for ((i=0; i<3 ; i++;))
    do
    echo -n `echo $line | tr "\n" " "`
    
    done
    i=0
    done < /tmp/moo.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      相关资源
      最近更新 更多