Transponieren Sie Zeilen in Spalten in das richtige Format

Transponieren Sie Zeilen in Spalten in das richtige Format

Ich habe 3 Textdateien alsemp id.txt, vorher sal.txt, jetzt sal.txt. Inhalt dieser 3 Dateien: -

Mitarbeiter-ID.txt

emp id ----- 1 4 7 10 13 16 19

vor sal.txt

before sal ----- 23 56 78 97 105 123 145

jetzt sal

now sal ---- 25 60 82 99 109 124 150

Ich habe das Folgende im Shell-Skript verwendet

awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) } END{ for (i in RtoC) print RtoC[i] }' um von Zeile zu Spalte zu konvertieren, erhielt ich eine Ausgabe wie -

1 23 25
4 56 60
7 78 82
10 97 99
13 105 109
16 123 124
19 145 150
emp before now
id  sal    sal
--- -----  ----

Aber ich möchte die Ausgabe im folgenden Format, etwa:

--------------------------------
|emp id  |before sal | now sal |
|--------|---------- | --------|
|1       | 23        |  25     |
|4       | 56        |  60     | 
|7       | 78        |  82     |
|10      | 97        |  99     |
|13      | 105       |  109    |
|16      | 123       |  124    |
|19      | 145       |  150    |
--------------------------------

Können Sie mir bitte dabei helfen, damit ich die Ausgabe im obigen Format erhalte?

Antwort1

step1:

for i in "emp_id.txt" "beforesal.txt" "nowsal.txt"; do perl -pne "s/ /\n/g" $i >> "$i"fi; done


step2:

paste emp_id.txtfi beforesal.txtfi nowsal.txtfi

Ausgabe

emp before  now
id  sal sal
-----   -----   ----
1   23  25
4   56  60
7   78  82
10  97  99
13  105 109
16  123 124
19  145 150

Antwort2

definiere eine kleine Funktion, die die Datei in eine Spalte umwandelt:

f2c() { tr -s '[:blank:]' '\n' < "$1"; }

dann verwenden Sie pastezum Zusammennähen der Spalten,Prozesssubstitutionenals einzufügende Dateiargumente und columnfür eine schöne Ausgabe.

paste <(f2c 'emp id.txt') <(f2c 'before sal.txt') <(f2c 'now sal.txt') | column -t
emp    before  now
id     sal     sal
-----  -----   ----
1      23      25
4      56      60
7      78      82
10     97      99
13     105     109
16     123     124
19     145     150

Antwort3

gegebenawkBefehleigentlich kommt es dem, was Sie als Ausgabe erwarten, sehr nahe, aber ja, teilen Sie den Header aufgrund von Leerzeichen in separate Zeilen auf (das wird kein Problem sein, wenn Ihre Eingabedateien mit Tabulatoren oder etwas anderem getrennt waren), jedenfalls habe ich nicht verstanden, wie der Header in den allerletzten Zeilen gedruckt wird, vielleicht awkhatten verschiedene Versionen unterschiedlicheSortierungPROCINFO["sorted_in"]="@val_num_desc"Option als Standard; Ihre Ausgabe wäre beispielsweise ähnlich wie unten (aber ich habe immer noch keine Ahnung, wie die Zahlen in Ihrem erwarteten Ergebnis aufsteigend sortiert sind):

19 145 150
16 123 124
13 105 109
10 97 99
7 78 82
4 56 60
1 23 25
id sal sal
emp before now
----- ----- ----

Versuchen wir es mit dem unten geänderten Befehl und prüfen wir, ob es das ist, was Sie brauchen oder ob es in etwa Ihren Erwartungen entspricht:

awk '{ $2=$1"_"$2; $1=""; 
       for (i=2; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] "\t" $i: $i) }
END{ PROCINFO["sorted_in"]="@unsorted";
     for (i in RtoC)  print RtoC[i];
}' emp.txt before.txt new.txt |column -t

Ausgabe:

emp_id  before_sal  now_sal
-----   -----       ----
1       23          25
4       56          60
7       78          82
10      97          99
13      105         109
16      123         124
19      145         150

verwandte Informationen