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]

浙公网安备 33010602011771号