给定一个文件 file.txt,转置它的内容。
你可以假设每行列数相同,并且每个字段由 ' ' 分隔.
示例:
假设 file.txt 文件内容如下:
name age
alice 21
ryan 30
应当输出:
name alice ryan
age 21 30
用awk命令来解决这个问题。
使用一个数组来保存每一列的数据
读取完毕后输出数组
awk基础用法
awk是用于处理字符串的很强大的工具,可以定义变量,添加控制流,是一种编程语言。
基础语法:
awk '{[匹配模式]{代码}}' {file}
awk的用法示例
file.txt 内容
Beth 4.00 0
Dan 3.75 0
kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
- 打印文件
awk '{print $0}' file.txt
#$0表示匹配的行,可以省略。$i表示行中空格分隔的第i个字符串(i>=1)
- 加上行号
awk '{{print $NR,$0}}' file.txt
#NR是内置变量,表示当前读到了文件的第几行。
1 Beth 4.00 0
2 Dan 3.75 0
3 kathy 4.00 10
4 Mark 5.00 20
5 Mary 5.50 22
6 Susie 4.25 18
- BEGIN & END 打印第二行的和
awk 'BEGIN {print "start"} {s=s+$2} END {print "sum:",s}' file.txt
#BEGIN: 在读取第一行数据,之前执行的代码
#s 是自定义变量,记录第二行数字之和
#END:读完最后一行执行的代码,打印结果
start
sum: 26.5
解决文件转置问题的代码
awk '{i=1;while(i <= NF){col[i]=col[i] $i " ";i=i+1}} END {i=1;while(i<=NF){print col[i];i=i+1}}' file.txt | sed 's/[ \t]*$//g'
这里有变量i
记录读取行的第i个元素,col[]
数组用于保存每一列的数据。对于每一行,第i
个元素追加到col[i]
变量。结束时,col[i]
保存了第i
列的数据,循环输出col[]
数组,不过每一行最后多了个空格,用sed
命令去掉后再打印
输入
Beth 4.00 0
Dan 3.75 0
kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
结果
Beth Dan kathy Mark Mary Susie
4.00 3.75 4.00 5.00 5.50 4.25
0 0 10 20 22 18