Bash

將垂直數組數據轉換為水平數組數據

  • June 8, 2016

我有一個文件,文件中有 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值,我們循環遍歷舊文件jj行數屬於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"三元語句。它返回一個空格 if j+nr<=NR。否則,它返回一個換行符。

引用自:https://unix.stackexchange.com/questions/288303