将每列拆分为“n”列,每列一个

时间:2016-07-15 14:38:19

标签: linux bash awk

我有一个包含一列和10行的文件。每列具有相同的字符数(5)。从这个文件中我想得到一个包含10行和5列的文件,其中每列只有1个字符。我不知道如何在Linux中这样做..任何帮助? AWK会这样做吗?

然而,真实数据具有更多行(> 4K)和字符(> 500K)。以下是真实数据的简短版本:

31313
30442
11020
12324
00140
34223
34221
43124
12211
04312

期望的输出:

3 1 3 1 3
3 0 4 4 2
1 1 0 2 0
1 2 3 2 4
0 0 1 4 0
3 4 2 2 3
3 4 2 2 1
4 3 1 2 4
1 2 2 1 1
0 4 3 1 2

谢谢!

4 个答案:

答案 0 :(得分:3)

我认为这样做符合你的要求:

$ awk -F '' '{ $1 = $1 }1' file
3 1 3 1 3
3 0 4 4 2
1 1 0 2 0
1 2 3 2 4
0 0 1 4 0
3 4 2 2 3
3 4 2 2 1
4 3 1 2 4
1 2 2 1 1
0 4 3 1 2

输入字段分隔符设置为空字符串,因此每个字符都被视为字段。 $1 = $1表示awk"触及"每个记录,使其重新格式化,在每个字符之间插入输出字段分隔符(空格)。 1是最短的" true"条件,导致awk打印每条记录。

请注意,将字段分隔符设置为空字符串的行为不是很明确,因此可能不适用于您的awk版本。您可能会发现不同地设置字段分隔符,例如使用-v FS=为你工作。

或者,你可以在Perl中做同样的事情:

perl -F -lanE 'say "@F"' file

-a将每个输入记录拆分为特殊数组@F-F后跟没有任何内容将输入字段分隔符设置为空字符串。 @F周围的引号表示在每个元素之间插入列表分隔符(默认为空格)。

答案 1 :(得分:2)

您也可以使用此sed

sed 's/./& /g; s/ $//' file

3 1 3 1 3
3 0 4 4 2
1 1 0 2 0
1 2 3 2 4
0 0 1 4 0
3 4 2 2 3
3 4 2 2 1
4 3 1 2 4
1 2 2 1 1
0 4 3 1 2

答案 2 :(得分:0)

奇怪的是,这对大多数标准Unix工具来说并不容易(更新:except, apparently, with awk)。我会用Python:

{{1}}

(这不是最好的惯用Python,但只需要一个简单的单线程。)

答案 3 :(得分:0)

此任务的另一个unix工具链

result