【Leetcode Shell】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
第一次嘗試
1
2
3
4
5
6
7
8
# Read from the file file.txt and print its transposed content to stdout.
n=`awk '{print NF}' file.txt | head -n1`
for((i=1;i<=$n;i++))
do 
    a=`echo $i`;
    awk '{print $'$a'}' file.txt | tr '\n' ' ';  
    printf "\012"
done
思想
(1)得出file.txt有多少列,將列數賦給n
(2)for循環,每次處理一列,使用awk命令取出一列,然後將回車換行符\n替換爲空格,在最後加一個回車換行("\012"),即完成了一列的轉置
結果報錯:

雖然結果正確,但是確實程序有些複雜,內存超了。。。
由於實在想不出什麼其他好方法,就去OJ討論區搜了一下,找到了一種accepted方法
OJ討論區的一種解答
1
2
3
4
5
6
7
8
cat file.txt | awk '{
for(i=1;i<=NF;++i) { 
     arr[i] = arr[i] $i " "
     }
END 
for (i=1;i<=NF;++i) 
     print substr(arr[i], 0, length(arr[i])-1)
}'

思想
(1)簡單來說awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各種分析處理。
         NF是指file.txt中的列數。
(2)假設i等於第n列時,arr[i] = arr[i] $i " "; 表示awk命令對第n行逐行讀入,
     假設第n行爲:aa
                                 bb
                                 cc
          則先讀入第一行,即aa。然後將第一行aa賦給數組arr[i],也即arr[n]。後面再加一個" ",即空格。然後第二行重新執行同樣的操作。結果爲:
  •   
    第一行  aa空格
    第二行 aa空格bb空格
    第三行 aa空格bb空格cc空格 
         所以arr[i] = arr[i] $i " ";最終結果爲arr[i]=aa空格bb空格cc空格
(3)awk使用方法
        awk '{pattern + action}' {filenames}
        其中 pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一系列命令。BEGIN和END的作用是給程序賦予初始狀態和在程序結束之後執行一些掃尾的工作。通常使用BEGIN來顯示變量和預置(初始化)變量,使用END來輸出最終結果。BEGIN會先執行,在輸入文件之前執行。END在輸入文件關閉後awk退出之前執行。
接下來只要將arr數組(arr[1],……,arr[NF])的元素輸出即可。所以END後面還需要一個循環,但是注意每個“arr[i]=aa空格bb空格cc空格”的末尾多出一個空格,所以需要在輸出時不顯示最後一個空格,因此用到substr(arr[i], 0, length(arr[i])-1)

本題知識點
1、awk的用法
2、數組的用法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章