当前位置: 代码迷 >> 综合 >> SHELL篇 转置文件
  详细解决方案

SHELL篇 转置文件

热度:71   发布时间:2024-01-26 07:58:16.0

题目:

给定一个文件 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

  相关解决方案