题目:
给定一个文件 file.txt,转置它的内容。
你可以假设每行列数相同,并且每个字段由 ' ' 分隔。
示例:
假设 file.txt 文件内容如下:
name age
alice 21
ryan 30
应当输出:
name alice ryan
age 21 30
解题方法一:
#/bin/bash
awk '{
# NF表示列数,NR表示当前行数
for (i=1; i<=NF; i++){
if(NR==1){
# 处理第一行时,将第i列的值($i)存入arr[i],i为数组的下标,数组不用定义可以直接使用
arr[i]=$i;
}
else{
# 不是第一行时,将该行对应i列的值拼接到arr[i]
arr[i]=arr[i] " " $i
}
}
}
END{
# 每行处理完以后,输出数组
for (i=1; i<=NF; i++){
print arr[i]
}
}' file.txt
执行耗时12ms,内存占用3.5M
解题方法二:
#!/bin/bash
fields=`awk 'END{print NF}' file.txt` # 获取列数,列数代表文件转置后的行数
for i in $(seq 1 ${fields})
do
awk -v i=$i -v ORS=' ' '{print $i}' file.txt | sed 's/[ ]*$//'
# -v传递awk环境外的变量,并设置内置变量ORS(输出换行分隔符),这里是将换行符"\n"设置空格符" "
# 使用sed删掉行尾最后一个空格符
echo # echo这里的作用是添加一个换行符
done
执行耗时12ms,内存占用3.6M