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]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律