我有这样一个文件:
n A B C D
1 01 02 01 01
2 02 02 01 01
我想按行传输列,所以输出应该是这样的:
n 1 2
A 01 02
B 02 02
C 01 01
D 01 01
我写了这个命令:
awk '{ for (i=1;i<=NF;i++ ) printf $i " " }' file.txt > out-file.txt
问题是这个命令把所有的东西都放在了一行!所以输出是这样的:
n 1 2 A 01 02 B 02 02 C 01 01 D 01 01
最佳答案
这是对数组的数组的使用,它是一个 gawk 扩展:
tp(){ awk '{for(i=1;i<=NF;i++)a[i][NR]=$i}END{for(i in a)for(j in a[i])printf"%s"(j==NR?"\n":FS),a[i][j]}' "FS=${1-$'\t'}";}
另一种选择是使用 rs
(它是 macOS 附带的 BSD 实用程序):
$ cat /tmp/a
n A B C D
1 01 02 01 01
2 02 02 01 01
$ rs -c' ' -C' ' -T</tmp/a|sed 's/.$//'
n 1 2
A 01 02
B 02 02
C 01 01
D 01 01
-c
更改输入列分隔符,-C
更改输出列分隔符,-T
转置行和列。
当使用 -C
指定输出列分隔符时,每个输出行的末尾都会添加一个额外的列分隔符,但您可以使用 sed 's/将其删除。 $//'
:
$ seq 4|paste -d, - -|rs -c, -C, -T
1,3,
2,4,
$ seq 4|paste -d, - -|rs -c, -C, -T|sed 's/.$//'
1,3
2,4
rs
命令在第一行以一个或多个空列结尾的情况下失败,因为列数是根据第一行的列数确定的:
$ rs -c, -C, -T<<<$'1,\n3,4'
1,3,4,
关于linux - 如何将列数据传输到行(使用awk)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9534744/