[LeetCode] Transpose File 转置文件
Given a text file file.txt
, transpose its content.
You may assume that each row has the same number of columns and each field is separated by the ' '
character.
For example, if file.txt
has the following content:
name age alice 21 ryan 30
Output the following:
name alice ryan age 21 30
这道题让我们转置一个文件,其实感觉就是把文本内容当做了一个矩阵,每个单词空格隔开看做是矩阵中的一个元素,然后将转置后的内容打印出来。那么我们先来看使用awk关键字的做法,关于awk的介绍可以参见这个帖子。其中NF表示当前记录中的字段个数,就是有多少列,NR表示已经读出的记录数,就是行号,从1开始。那么在这里NF是2,因为文本只有两列,这里面这个for循环还跟我们通常所熟悉for循环不太一样,通常我们以为i只能是1和2,然后循环就结束了,而这里的i实际上遍历的数字为1,2,1,2,1,2,我们可能看到实际上循环了3遍1和2,而行数正好是3,可能人家就是这个机制吧。知道了上面这些,那么下面的代码就不难理解了,遍历过程如下:
i = 1, s = [name]
i = 2, s = [name; age]
i = 1, s = [name alice; age]
i = 2, s = [name alice; age 21]
i = 1, s = [name alice ryan; age 21]
i = 2, s = [name alice ryan; age 21 30]
然后我们再将s中的各行打印出来即可,参见代码如下:
解法一:
awk '{ for (i = 1; i <= NF; ++i) { if (NR == 1) s[i] = $i; else s[i] = s[i] " " $i; } } END { for (i = 1; s[i] != ""; ++i) { print s[i]; } }' file.txt
下面这种方法和上面的思路完全一样,但是代码风格不一样,上面是C语言风格,而这个完全就是Bash脚本的风格了,我们用read关键字,我们可以查看read的用法read: usage: read [-ers] [-u fd] [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] [name ...]。那么我们知道-a表示数组,将读出的每行内容存入数组line中,那么下一行for中的一堆特殊字符肯定让你头晕眼花,关于shell中的特殊变量可以参见这个帖子,其实我也不能算特别理解下面的代码,大概觉得跟上面的思路一样,求大神来具体给讲解下哈:
解法二:
while read -a line; do for ((i = 0; i < "${#line[@]}"; ++i)); do a[$i]="${a[$i]} ${line[$i]}" done done < file.txt for ((i = 0; i < ${#a[@]}; ++i)); do echo ${a[i]} done
参考资料:
https://leetcode.com/problems/transpose-file/
https://leetcode.com/problems/transpose-file/discuss/55522/AC-Solution%3A-8-lines-only-in-pure-Bash
相关文章
- Java实现 LeetCode 837 新21点(DP)
- Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
- Java实现 LeetCode 482 密钥格式化
- Java实现 LeetCode 477 汉明距离总和
- Java实现 LeetCode 374 猜数字大小
- (LeetCode 135) Candy
- [LeetCode] H-Index
- LeetCode-937. 重新排列日志文件【stable_sort(),自定义排序】
- LeetCode-883. 三维形体投影面积【几何,数学,数组,矩阵】
- LeetCode-388. 文件的最长绝对路径【栈】
- 【LeetCode Python实现】937. 重新排列日志文件(简单)
- leetcode 198. House Robber
- 【LeetCode】剑指 Offer II 020. 回文子字符串的个数