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

Linux 将每列拆分为“n”列,每列一个字符,linux,bash,awk,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

我有一个只有一列和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

谢谢

奇怪的是,对于大多数标准Unix工具更新来说,这并不是一件小事:。我将使用Python:

python -c 'import sys; map(sys.stdout.write, map(" ".join, sys.stdin))' in.txt > new.txt

这不是最好的惯用Python,但它只需要一行代码就足够了。

奇怪的是,对于大多数标准的Unix工具更新来说,这并不是一件小事。我将使用Python:

python -c 'import sys; map(sys.stdout.write, map(" ".join, sys.stdin))' in.txt > new.txt

这不是最优秀的惯用Python,但它只需要一行代码就足够了。

我认为这正是您想要的:

$ 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是最短的真实条件,导致awk打印每条记录

请注意,将字段分隔符设置为空字符串的行为没有得到很好的定义,因此在您的awk版本中可能不起作用。您可能会发现以不同的方式设置字段分隔符,例如使用-v FS=对您有效

或者,您可以在Perl中执行大致相同的操作:

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

-a将每个输入记录拆分为特殊数组@F.-F,后跟nothing将输入字段分隔符设置为空字符串。@F周围的引号表示列表分隔符默认情况下在每个元素之间插入空格。

我认为这符合您的要求:

$ 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是最短的真实条件,导致awk打印每条记录

请注意,将字段分隔符设置为空字符串的行为没有得到很好的定义,因此在您的awk版本中可能不起作用。您可能会发现以不同的方式设置字段分隔符,例如使用-v FS=对您有效

或者,您可以在Perl中执行大致相同的操作:

perl -F -lanE 'say "@F"' file
-a将每个输入记录拆分为特殊数组@F.-F,后跟nothing将输入字段分隔符设置为空字符串。@F周围的引号表示列表分隔符默认情况下在每个元素之间插入空格。

您也可以使用此sed:

您也可以使用此sed:


此任务的另一个unix工具链

$ while read line; do echo $line | fold -w1 | xargs; done < 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

此任务的另一个unix工具链

$ while read line; do echo $line | fold -w1 | xargs; done < 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

您的问题也将向我们展示输出的样子。您的问题也将向我们展示输出的样子。谢谢您的回答!我尝试了此操作,但收到以下消息:awk:字段分隔符FS为空。所以,我在谷歌上搜索了一下,我把你的代码改成了awk-vfs='{$1=$1}1'文件,它成功了!!!谢谢你的帮助!谢谢你的回答!我尝试了此操作,但收到以下消息:awk:字段分隔符FS为空。所以,我在谷歌上搜索了一下,我把你的代码改成了awk-vfs='{$1=$1}1'文件,它成功了!!!谢谢你的帮助!使用gnused,您可以使用gnused执行sed的//&/2g,使用gnused,您可以执行sed的//&/2g