如何将包含单个列的文本文件转换为矩阵?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将包含单个列的文本文件转换为矩阵?相关的知识,希望对你有一定的参考价值。
我有一个文本文件,其中包含一列数字,如下所示:
1
2
3
4
5
6
我想将它转换为两列,从左到右依次为:
1 2
3 4
5 6
我可以这样做:
awk '{print>"line-"NR%2}' file
paste line-0 line-1 >newfile
但我认为依赖两个中间文件会使脚本变得脆弱。
我想使用像cat file | mystery-zip-command >newfile
这样的东西
答案
您可以使用paste
执行此操作:
paste -d " " - - < file > newfile
你也可以使用pr
:
pr -ats" " -2 file > newfile
-a
- 使用循环法令-t
- 压制标题和预告片-s " "
- 使用单个空格作为分隔符-2
- 两列输出
也可以看看:
另一答案
另一种选择
$ seq 6 | xargs -n2
1 2
3 4
5 6
或者与awk
$ seq 6 | awk '{ORS=NR%2?FS:RS}1'
1 2
3 4
5 6
如果你希望输出在奇数个输入行的情况下以新行终止。
$ seq 7 | awk '{ORS=NR%2?FS:RS}1; END{ORS=NR%2?RS:FS; print ""}'
1 2
3 4
5 6
7
另一答案
awk 'NR % 2 == 1 { printf("%s", $1) }
NR % 2 == 0 { printf(" %s\n", $1) }
END { if (NR % 2 == 1) print "" }' file
打印出奇数行,后面没有换行符,打印第一列。偶数行首先打印空格,然后打印换行符,以打印第二列。最后,如果有奇数行,我们打印换行符,这样我们就不会在行的中间结束。
另一答案
用bash:
while IFS= read -r odd; do IFS= read -r even; echo "$odd $even"; done < file
输出:
1 2 3 4 5 6
另一答案
$ seq 6 | awk '{ORS=(NR%2?FS:RS); print} END{if (ORS==FS) printf RS}'
1 2
3 4
5 6
$
$ seq 7 | awk '{ORS=(NR%2?FS:RS); print} END{if (ORS==FS) printf RS}'
1 2
3 4
5 6
7
$
请注意,它总是添加一个终止换行符 - 这很重要,因为将来的命令可能依赖于它,例如:
$ seq 6 | awk '{ORS=(NR%2?FS:RS); print}' | wc -l
3
$ seq 7 | awk '{ORS=(NR%2?FS:RS); print}' | wc -l
3
$ seq 7 | awk '{ORS=(NR%2?FS:RS); print} END{if (ORS==FS) printf RS}' | wc -l
4
如果您的需求发生变化,只需将2
的单个匹配项更改为3
或您想要的多个列:
$ seq 6 | awk '{ORS=(NR%3?FS:RS); print} END{if (ORS==FS) printf RS}'
1 2 3
4 5 6
$ seq 7 | awk '{ORS=(NR%3?FS:RS); print} END{if (ORS==FS) printf RS}'
1 2 3
4 5 6
7
$ seq 8 | awk '{ORS=(NR%3?FS:RS); print} END{if (ORS==FS) printf RS}'
1 2 3
4 5 6
7 8
$ seq 9 | awk '{ORS=(NR%3?FS:RS); print} END{if (ORS==FS) printf RS}'
1 2 3
4 5 6
7 8 9
$
另一答案
短awk方法:
awk '{print ( ((getline nl) > 0)? $0" "nl : $0 )}' file
输出:
1 2
3 4
5 6
(getline nl)>0
-getline
将获得下一个记录并将其分配给变量nl
。 getline命令如果找到记录则返回1
,如果遇到文件末尾则返回0
简短的GNU sed方法:
sed 'N;s/\n/ /' file
N
- 在模式空间中添加换行符,然后将下一行输入附加到模式空间s/\n/ /
- 用捕获的模式空间中的空格替换换行符
另一答案
seq 6 | tr '\n' ' ' | sed -r 's/([^ ]* [^ ]* )/\1\n/g'
以上是关于如何将包含单个列的文本文件转换为矩阵?的主要内容,如果未能解决你的问题,请参考以下文章
如何将文本文件的内容转换为单个变量? (java) [重复]
如何将 Matlab 变量转换为带有标题的 .dat(文本)文件