Wie kann ich diese Daten in getrennten Spalten darstellen?

Wie kann ich diese Daten in getrennten Spalten darstellen?
Frequencies -- 1403.6738 1403.6738 1403.6738
IR Inten -- 25.0809 25.0809 25.0809

Ich möchte zwei Spalten erhalten

Frequencies     IR Inten
1403.6738       25.0809

und so weiter

Antwort1

Verwendung von Raku (der Programmiersprache, die früher als Perl6 bekannt war)

Für Probleme wie dieses verfügt Raku über einen praktischen ZOperator zum „Komprimieren“ von Elementen, jeweils eines aus jeder Liste:

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

Hinweis: Ich musste die Kopfzeile oben korrigieren, sodass die zweite Spalte den Titel " IR_Inten" trägt. Sie können sie manuell bearbeiten oder den folgenden Code ausführen, bevor Sie die Daten mit dem obigen Code neu anordnen:

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

Antwort2

Verwenden eines beliebigen awk in einer beliebigen Shell auf jeder Unix-Box:

$ 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

und für eine beliebige Anzahl von Ausgabezeilen und -spalten zu arbeiten:

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

Antwort3

Mit awk können wir die Datentransformation durchführen.

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

Die Grundidee besteht darin, zuerst das Array zu füllen und am Ende die Länge des Arrays aufzuzeichnen. Dann zerlegt man das Array in N/NR Teile und wählt aus jedem Teil die entsprechenden Elemente aus. In anderen Sprachen wie Python heißt dieser Vorgang zip.

verwandte Informationen