我有一个输入文件如下:
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)
使用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.