我有一个如下所示的文件:
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?我什么都想不到。
答案 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\ - - -