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

标签 linux awk rows

我有这样一个文件:

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/

相关文章:

c - Objcopy --writable-text 没有使 elf 二进制文本部分可写?

java - Bash检测bash中的彩色文本输出

windows - 内部网站的url结构

awk 不打印到文件

awk - AWK错误: Attempt to use array in a scalar context

c# - WPF DataGrid 添加行但不添加数据(空白行)

php - linux mint 中禁止访问 apache localhost

linux - sed,awk.grep - 如果该行尚不存在,则在配置部分的末尾添加一行

Mysql JOIN 多个表并选择多个值

python - Pandas :如何获取索引之间的行?