将文本文件转换为列

我对awk相当陌生,这是我要问的第一个问题。 如果我的问题已经得到解答,请直接给我正确的一个。 谢谢。 到目前为止,我没有find解决办法,也没有设法达到我想要的输出。 假设我有科学数据,所有数字排列在一个列中,但是用m(高度)表示n(宽度)的强度matrix。 input文件的列总共有n * m行。 input示例可能如下所示:

1
2
3
……
三十

新的输出应该是这样的,我有n行新的m行。 坚持我的例子,有30个字段的input和n = 3,m = 10我需要这样的输出文件(分隔符不重要,可以是空白,标签等):

1 11 21
2 12 22
…… …
10 20 30

我在Windows下使用gawk。 请注意,没有特殊的FS,更现实的例子是60 * 60或更大。 感谢所有的答案或build议。

Solutions Collecting From Web of "将文本文件转换为列"

如果你不仅限于awk而且还有GNU core-utils (cygwin,native,..),那么最简单的解决方案就是使用pr

 pr -ts" " --columns 3 file 

这是一个相当简单的解决方案(在我已经设置n等于3的例子中,为n插入适当的值):

 awk -vn=3 '{ row = row $1 " "; if (NR % n == 0) { print row; row = "" } }' FILE 

这是通过一次一行地读入记录来连接每行与前面的行。 当n行连接在一起时,它将连接的结果打印在一行中。 这一直重复,直到输入中没有更多的行。

我相信这样做:

 awk ' { split($0,data); } END { m = 10; n = 3; for( i = 1; i<=m; i++ ) { for( j = 0; j<n; j++ ) { printf "%s ", data[j*m + i] # output data plus space in one line } # here you might want to start a new line though you did not ask for it: printf "\n"; } }' inputfile 

我可能有指数计算错误,但我相信你可以弄明白。 诀窍是在第一行的split 。 它将输入分割为空白并创建一个数组dataEND块在处理END文件之后运行,只是通过索引访问data 。 注意数组索引从0开始计数。

假设是所有的数据都在一行中。 你的问题不太清楚。 如果它在几行上,你必须以不同的方式读入数组。

希望这会让你开始。

编辑我注意到,当我回答时你改变了你的问题。 所以改变

 { split($0,data); } 

 { data[++i] = $1; } 

以考虑在不同的线路上的输入。 实际上,这可以让你选择将它读入一个二维数组中。

编辑2

读取二维数组要读取为二维数组,假设事先知道mn ,而不是在输入中编码:

 awk ' BEGIN { m = 10; n = 3; } { for( i = 0; i<m; i++ ) { for( j = 0; j<n; j++ ) { data[i,j] = $0; } } # do something with data }' inputfile 

但是,由于您只想重新格式化数据,因此可以立即执行。 结合两个解决方案,在命令行上删除data并传递mn

 awk -vm=10 -vn=3' { for( i = 0; i<m; i++ ) { for( j = 0; j<n; j++ ) { printf "%s ", $0 # output data plus space in one line } printf "\n"; } }' inputfile 

你可以使用下面的命令

 paste - - - < input.txt 

默认情况下,分隔符是TAB,要更改分隔符,请使用下面的命令

 paste - - - -d' ' < input.txt