![Transponieren Sie Zeilen in Spalten in das richtige Format](https://rvso.com/image/164728/Transponieren%20Sie%20Zeilen%20in%20Spalten%20in%20das%20richtige%20Format.png)
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 paste
zum Zusammennähen der Spalten,Prozesssubstitutionenals einzufügende Dateiargumente und column
fü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
gegebenawk
Befehleigentlich 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 awk
hatten 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