Bash
將垂直數組數據轉換為水平數組數據
我有一個文件,文件中有 25 個矩陣,每個矩陣有 128 行和 5 列。每個矩陣以垂直方式一個接一個地放置。像這樣
文件輸入(file1):
Array1 Array2 Array3 ... Array25
我想以水平方式放置每個數組。像這樣(文件2)
Array1 Array2 Array3 ... Array25
我嘗試使用此命令:
pr -25t -w 4000 file1 > file2
但是沒有按我的意願工作。
讓我們考慮這個測試文件,其中包含每個 3 行的數組:
$ cat File 1 2 3 4 5 6 a b c d e f A B C D E F
現在,讓我們連接數組:
$ awk -v nr=3 '{a[NR]=$0} END{for (i=1;i<=nr;i++) {for (j=i;j<=NR;j+=nr) printf "%s ",a[j]; print""}}' File 1 2 a b A B 3 4 c d C D 5 6 e f E F
在您的數據文件中,每個數組有 128 行。在這種情況下,執行:
awk -v nr=128 '{a[NR]=$0} END{for (i=1;i<=nr;i++) {for (j=i;j<=NR;j+=nr) printf "%s ",a[j]; print""}}' File
這個怎麼運作
-v nr=128
這會將變數設置
nr
為每個數組的行數。
a[NR]=$0
NR
是行號。我們將每一行(行)保存在數組中a
。
END{for (i=1;i<=nr;i++) {for (j=i;j<=NR;j+=nr) printf "%s ",a[j]; print""}}
在我們讀完所有行之後,這會以您想要的形式再次寫出它們。
為此,我們遍歷以
i
開頭i=1
和結尾的變數i=nr
。對於每個i
,我們列印新行i
。對於每個i
值,我們循環遍歷舊文件j
的j
行數屬於i
新文件的行。變化
雖然它使初學者更難閱讀,但可以使用三元語句對格式進行輕微改進:
$ awk -v nr=3 '{a[NR]=$0} END{for (i=1;i<=nr;i++) for (j=i;j<=NR;j+=nr) printf "%s%s",a[j],(j+nr<=NR?" ":"\n")}' File 1 2 a b A B 11 22 3 4 c d C D 33 44 5 6 e f E F 55 66
j+nr<=NR?" ":"\n"
是三元語句。它返回一個空格 ifj+nr<=NR
。否則,它返回一個換行符。