bash:将五行输入组合到每行输出

Raj*_*Raj 3 unix bash shell

我有一个输入文件如下:

MB1 00134141 
MB1 12415085 
MB1 13253590
MB1 10598105
MB1 01141484
...
...
MB1 10598105
Run Code Online (Sandbox Code Playgroud)

我想组合5行并将其合并为一行.我希望我的bash脚本处理bash脚本以生成输出,如下所示 -

MB1 00134141 MB1 12415085 MB1 13253590 MB1 10598105 MB1 01141484
...
...
...                                                 
Run Code Online (Sandbox Code Playgroud)

我写了下面的脚本,它可以工作,但对于大小为23051行的文件来说速度很慢.我可以编写更好的代码来加快速度吗?

#!/bin/bash
file=timing.csv
x=0
while [ $x -lt $(cat $file | wc -l) ]
do
   line=`head -n $x $file | tail -n 1`
   echo -n $line " "
   let "remainder = $x % 5"
   if [ "$remainder" -eq 0 ] 
   then
        echo ""
   fi
   let x=x+1
done
exit 0
Run Code Online (Sandbox Code Playgroud)

我试图执行以下命令,但它弄乱了一些数字.

cat timing_deleted.csv | pr -at5
Run Code Online (Sandbox Code Playgroud)

小智 8

使用tr:

cat input_file | tr "\n" " "
Run Code Online (Sandbox Code Playgroud)

  • cat 的无用使用:最好写成 `tr '\n' ' ' <input_file`,为 `tr` 提供输入文件上的直接文件句柄,而不是通往读取输入文件的不同进程的管道。 (2认同)

che*_*ner 5

使用paste命令:

 paste -d ' ' - - - - - < tmp.txt
Run Code Online (Sandbox Code Playgroud)

paste好多了,但我不能让自己删除我以前mapfile的解决方案.

[更新:与4.2.35mapfile版本一起使用时读取太多行-n]

#!/bin/bash
file=timing.csv
while true; do
    mapfile -t -n 5 arr
    (( ${#arr} > 0 )) || break
    echo "${arr[*]}"
done < "$file"
exit 0
Run Code Online (Sandbox Code Playgroud)

我们不能这样做,while mapfile ...; do因为mapfile即使它没有读取任何输入也存在状态0.