2015-11-04 35 views
2

如何可以在固定尺寸的几个柱拆分单个列的几个柱拆分柱,例如我有一个这样的柱:在bash哪能在固定尺寸

1 
2 
3 
4 
5 
6 
7 
8 

和尺寸页。 ex 4,我想获得

1 5 
2 6 
3 7 
4 8 

或对于大小p。 ex 2,我想获得

1 3 5 7 
2 4 6 8 
+1

那你试试? –

+0

@Thomas @Thomas我曾尝试公关,没有成功折叠 – famedoro

回答

1

用awk:

awk ' 
    BEGIN { 
    # Numbers of rows to print 
    n=4; 
    } 
    { 
    # Add to array with key = 0, 1, 2, 3, 0, 1, 2, .. 
    l[(NR-1)%n] = l[(NR-1)%n] " " $0 
    }; 
    END { 
    # print the array 
    for (i = 0; i < length(l); i++) { 
     print l[i]; 
    } 
    } 
' file 
+0

号码的列非常感谢,它的作品 – famedoro

0

如果您知道所需的输出宽度,您可以使用column

# Display in columns for an 80 column display 
cat file | column -c 80 
+0

@rgnomeId如果我有一列从1到40,我想分成几列,每一列有10个元素 – famedoro

+0

输入项全部是固定大小? – rghome

+0

@rgnome我曾尝试使用从1到40 – famedoro

2

OK,这是一个有点长篇大论,而不是犯错,但下面应该工作:

td=$(mktemp -d); split -l <rows> <file> ${td}/x ; paste $(ls -1t ${td}/x*) ; rm -rf ${td}; unset td 

哪里<cols>是你想要的行数和file是你的输入文件。 说明:

td=$(mktemp -d) 

创建一个临时目录,这样我们就可以把临时文件进去。将其存储在td中 - 有可能您的shell已经有td变量,但是如果您为此设置了子shell,那么您的范围应该没问题。

split -l <rows> <file> f ${td}/x 

将原始文件拆分成许多较小的文件,每个文件长<rows>。这些将投入temp目录下的所有文件将与x

paste $(ls -1t ${td}/x*) 

前缀将这些文件写入出来,这样在连续列

rm -rf ${td} 

行删除的文件和目录。

unset td 

清洁环境。

2

假设你知道在你列的行数(这里是8):

n=8 
# to get output with 4 rows: 
seq $n | pr -ts" " -$((n/4)) 
1 5 
2 6 
3 7 
4 8 
# to get output with 2 rows: 
seq $n | pr -ts" " -$((n/2)) 
1 3 5 7 
2 4 6 8