如何在bash中对连续行进行分组?

时间:2011-05-20 15:48:28

标签: bash command-line

我有一个如下所示的文件:

a
b
c
d
e
f
g
h
i
j
k
l
m

我想将其重新格式化为:

a b c
d e f
g h i
j k l
m

我希望列数可配置。你怎么用bash?我什么都想不到。

5 个答案:

答案 0 :(得分:11)

host:~ user$ cat file
a
b
c
d
e
f
g
h
i
j
k
l
m
host:~ user$ xargs -L3 echo < file
a b c
d e f
g h i
j k l
m
host:~ user$ 

将'3'替换为您想要的列数。

答案 1 :(得分:5)

xargs答案的略微改进版本将是:

xargs -n3 -r < file

这种方式可以更好地处理尾随空格,并避免为无输入创建单个空行

答案 2 :(得分:3)

另一个:

zsh-4.3.11[t]% paste  -d\  - - - < infile
a b c
d e f
g h i
j k l
m  

或者(如果你不关心最后的换行符):

zsh-4.3.11[t]% awk 'ORS = NR % m ? FS : RS' m=3 infile 
a b c
d e f
g h i
j k l
m %     

答案 3 :(得分:1)

column -x -c 30 /tmp/file
a       b       c
d       e       f
g       h       i
j       k       l
m

是的,间距并不完全符合您的要求,但它会处理可变大小的输入“更好”(对于某些更好的定义)。

答案 4 :(得分:1)

由于<运算符颠倒了事物的顺序,我想出了这种更直观的方法:

cat file | xargs -n3

然而,在使用大文件进行测试后,paste方法变得更快:

cat file | paste -d\ - - -