Pipes實(shí)現(xiàn)LeetCode(194.轉(zhuǎn)置文件)
[LeetCode] 194.Transpose File 轉(zhuǎn)置文件
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
這道題讓我們轉(zhuǎn)置一個(gè)文件,其實(shí)感覺就是把文本內(nèi)容當(dāng)做了一個(gè)矩陣,每個(gè)單詞空格隔開看做是矩陣中的一個(gè)元素,然后將轉(zhuǎn)置后的內(nèi)容打印出來(lái)。那么我們先來(lái)看使用awk關(guān)鍵字的做法。其中NF表示當(dāng)前記錄中的字段個(gè)數(shù),就是有多少列,NR表示已經(jīng)讀出的記錄數(shù),就是行號(hào),從1開始。那么在這里NF是2,因?yàn)槲谋局挥袃闪?,這里面這個(gè)for循環(huán)還跟我們通常所熟悉for循環(huán)不太一樣,通常我們以為i只能是1和2,然后循環(huán)就結(jié)束了,而這里的i實(shí)際上遍歷的數(shù)字為1,2,1,2,1,2,我們可能看到實(shí)際上循環(huán)了3遍1和2,而行數(shù)正好是3,可能人家就是這個(gè)機(jī)制吧。知道了上面這些,那么下面的代碼就不難理解了,遍歷過程如下:
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]
然后我們?cè)賹中的各行打印出來(lái)即可,參見代碼如下:
解法一:
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
下面這種方法和上面的思路完全一樣,但是代碼風(fēng)格不一樣,上面是C語(yǔ)言風(fēng)格,而這個(gè)完全就是Bash腳本的風(fēng)格了,我們用read關(guān)鍵字,我們可以查看read的用法read: usage: read [-ers] [-u fd] [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] [name ...]。那么我們知道-a表示數(shù)組,將讀出的每行內(nèi)容存入數(shù)組line中,那么下一行for中的一堆特殊字符肯定讓你頭暈眼花,其實(shí)我也不能算特別理解下面的代碼,大概覺得跟上面的思路一樣,求大神來(lái)具體給講解下哈:
解法二:
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
到此這篇關(guān)于Pipes實(shí)現(xiàn)LeetCode(194.轉(zhuǎn)置文件)的文章就介紹到這了,更多相關(guān)Pipes實(shí)現(xiàn)轉(zhuǎn)置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Pipes實(shí)現(xiàn)LeetCode(193.驗(yàn)證電話號(hào)碼)
- Pipes實(shí)現(xiàn)LeetCode(195.第十行)
- Pipes實(shí)現(xiàn)LeetCode(192.單詞頻率)
- C++實(shí)現(xiàn)LeetCode(191.位1的個(gè)數(shù))
- C++實(shí)現(xiàn)LeetCode(190.顛倒二進(jìn)制位)
- C++實(shí)現(xiàn)LeetCode(309.買股票的最佳時(shí)間含冷凍期)
- C++實(shí)現(xiàn)LeetCode(188.買賣股票的最佳時(shí)間之四)
- SQL實(shí)現(xiàn)LeetCode(196.刪除重復(fù)郵箱)
相關(guān)文章
有關(guān)C++中隨機(jī)函數(shù)rand() 和srand() 的用法詳解
下面小編就為大家?guī)?lái)一篇有關(guān)C++中隨機(jī)函數(shù)rand() 和srand() 的用法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-01-01SQL Server中的數(shù)據(jù)復(fù)制到的Access中的函數(shù)
SQL Server中的數(shù)據(jù)復(fù)制到的Access中,表的結(jié)構(gòu)相同 不要提用openrowset,因?yàn)锳ccess文件和SQL Server不在一臺(tái)機(jī)器上2008-11-11Objective-C的內(nèi)省(Introspection)用法小結(jié)
這篇文章主要介紹了Objective-C的內(nèi)省(Introspection)用法,這是面向?qū)ο笳Z(yǔ)言和環(huán)境的一個(gè)強(qiáng)大特性,需要的朋友可以參考下2014-07-07C 語(yǔ)言基礎(chǔ)教程(我的C之旅開始了)[八]
C 語(yǔ)言基礎(chǔ)教程(我的C之旅開始了)[八]...2007-02-02