
Frequencies -- 1403.6738 1403.6738 1403.6738
IR Inten -- 25.0809 25.0809 25.0809
我想要兩列
Frequencies IR Inten
1403.6738 25.0809
等等
答案1
使用 Raku(以前稱為 Perl6 的程式語言)
Raku 有一個巧妙的Z
運算子來解決此類問題,可以「壓縮」項目,每個清單中都有一個:
~$ raku -e 'my @array1 = lines(); put ( [Z] @array1[0].words, @array1[1].words).join("\n");' Freq_IR.txt
Frequencies IR_Inten
-- --
1403.6738 25.0809
1403.6738 25.0809
1403.6738 25.0809
注意:我必須更正上面的標題行,以便第二列的標題為「IR_Inten
」。在使用上面的程式碼重新排列資料之前,您可以手動編輯或執行下面的程式碼:
~$ raku -pe 's/IR \s Inten/IR_Inten/;' Freq_IR.txt > Freq_IR2.txt
HTH。
https://raku.org
https://docs.raku.org/language/operators#Zip_metaoperator
https://docs.raku.org/language/operators#index-entry-[+]_(reduction_metaoperators)
答案2
在每個 Unix 機器上的任何 shell 中使用任何 awk:
$ awk -F' -- ' -v OFS='\t' '
{ hdr[NR]=$1; n=split($2,v," "); for (i in v) vals[NR,i]=v[i] }
END { print hdr[1], hdr[2]; for (i=1; i<=n; i++) print vals[1,i], vals[2,i] }
' file
Frequencies IR Inten
1403.6738 25.0809
1403.6738 25.0809
1403.6738 25.0809
並適用於任意數量的輸出行和列:
awk -F' -- ' -v OFS='\t' '
{ hdr[NR]=$1; n=split($2,v," "); for (i in v) vals[NR,i]=v[i] }
END {
for (c=1; c<=NR; c++) {
printf "%s%s", hdr[c], (c<NR ? OFS : ORS)
}
for (r=1; r<=n; r++) {
for (c=1; c<=NR; c++) {
printf "%s%s", vals[c,r], (c<NR ? OFS : ORS)
}
}
}
' file
答案3
使用 awk 我們可以進行資料轉換。
awk -F ' -- ' '
{
# populate the array
a[++N] = $1; split($2, t, " ")
for (k in t) { a[++N] = t[k] }
}
END {ORS = ""
for (c=i=1; i<=N/NR; i++) {
for (j=i; j<=N; j+=N/NR) {
print a[j] (c++%NR ? "\t" : "\n")
}
}
}
' file
Frequencies IR Inten
1403.6738 25.0809
1403.6738 25.0809
1403.6738 25.0809
基本思想是先填充數組並在末尾記錄數組的長度。然後將陣列分成 N/NR 個部分,並從每個部分中選取對應的元素。在 Python 等其他語言中,此操作稱為zip
。