shell脚本文件内容转置

文件转置-题目来自leetcode题库

假设 file.txt 文件内容如下:

name age
alice 21
ryan 30

应当输出:

name alice ryan
age 21 30

解题语句

awk '{ for(i=1; i<=NF; ++i) 
        {if (word[i] == "") 
            {word[i] = $i} 
        else
            {word[i] = word[i]" "$i}
        }
    } 
    END{
        for(i=1; i<=NF; ++i) 
        {print word[i]}
    }' file.txt

各个步骤详解

awk中的for循环

因为是对文件内容转置,因此我们采用awk处理文本语言

for(i=1; i<=NF; ++i) 
        {if (word[i] == "") 
            {word[i] = $i} 
        else
            {word[i] = word[i]" "$i}
        }

一个for循环。NF是文件的列数,file.txt一共两列,
if判断,这里的word[i]无需定义即可直接用,因为一开始肯定是空,可以看下面语句,方便理解

awk '{ for(i=1; i<=NF; ++i) {print i,$i,word[i]}}' file.txt

输出结果

1 name 
2 age 
1 alice 
2 21 
1 ryan 
2 30 

由此可见,i指的是列数,$i指的是对应的值,其中awk是逐行去判断的,因此得出上述的结果,这么看就比较明显了
word[i] 其实只有word[1] 和 word[2]
第一次判断的时候 word[1] 必为空,因此 word[1]=$i 将值赋值给word[1]
之后再一次遇到word[1] 的时候, word[1]就不是空了 而是第一次赋值的 name ,也就是进入了if判断中的另一个分支,word[i] = word[i]" "$i 也就是说 word[i] = name alice
以此类推。其实就是一个for循环和if判断。

awk中的END

是指在执行完上述的的结果后,在进行END中的操作

END{
        for(i=1; i<=NF; ++i) 
        {print word[i]}
    }'

这就非常好理解了,就是循环列数,然后输出之前处理后的word[1] 和 word[2]

posted @   otowa  阅读(205)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示