题目:
给定一个文件 file.txt,转置它的内容。
你可以假设每行列数相同,并且每个字段由 ' ' 分隔。
示例:
假设 file.txt 文件内容如下:
name age
alice 21
ryan 30
应当输出:
name alice ryan
age 21 30
解题方法一:
#/bin/bashawk '{ # 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/bashfields=`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