gpt4 book ai didi

linux - 如何将列数据传输到行(使用awk)?

转载 作者:IT王子 更新时间:2023-10-28 23:59:34 25 4
gpt4 key购买 nike

我有这样一个文件:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com