このデータを列ごとに分けるにはどうしたらいいでしょうか

このデータを列ごとに分けるにはどうしたらいいでしょうか
Frequencies -- 1403.6738 1403.6738 1403.6738
IR Inten -- 25.0809 25.0809 25.0809

2列にしたい

Frequencies     IR Inten
1403.6738       25.0809

等々

答え1

Raku (以前は Perl6 と呼ばれていたプログラミング言語) を使用する

Raku にZは、各リストから 1 つの項目を「圧縮」する次のような問題に対する便利な演算子があります。

~$ 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

注: 上記のヘッダー行を修正して、2 番目の列のタイトルを " IR_Inten" にする必要がありました。上記のコードを使用してデータを再配置する前に、手動で編集するか、以下のコードを実行できます。

~$ raku -pe 's/IR \s Inten/IR_Inten/;'  Freq_IR.txt > Freq_IR2.txt

ありがとう。

https://raku.org
https://docs.raku.org/language/operators#Zip_metaoperator
https://docs.raku.org/language/operators#index-entry-[+]_(reduction_metaoperators)

答え2

あらゆる Unix ボックス上のあらゆるシェルで 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

関連情報