SHELL篇 转置文件

题目:

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

发布了85 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42595012/article/details/104042787