2017-05-26 3 views
0

Ich möchte Zeilen und Spalten einer Textdatei mit Unix-Skript transponieren. Könnte jemand bitte das Work Around vorschlagen?Wie werden Zeilen und Spalten in der Unix-Shell transponiert?

Eingabedatei: input.txt

DM_AG_POSN_FDIC_BASE 22-MAY-2017 02:56:00 03:15:46 00:19:46 
DM_AG_POSN_FDIC_BASE 23-MAY-2017 03:26:47 03:45:33 00:18:46 
DM_EC_CONS_POSN_BASE_HELPER  22-MAY-2017 03:06:43  03:08:38 00:01:55 
DM_EC_POSN_B3_ENRICHED 22-MAY-2017 03:08:43  03:23:14 00:14:31 
DM_EC_POSN_B3_PRORATED 22-MAY-2017 03:23:27  03:30:07 00:06:40 
DM_EC_CONS_POSN_BASE_HELPER  23-MAY-2017 03:36:21  03:38:10 00:01:49 
DM_EC_POSN_B3_ENRICHED 23-MAY-2017 03:38:23  04:00:08 00:21:44 
DM_EC_POSN_B3_PRORATED 23-MAY-2017 04:00:08  04:06:30 00:06:21 

Erforderliche Ausgabedatei ist:

DM_AG_POSN_FDIC_BASE     DM_EC_CONS_POSN_BASE_HELPER    DM_EC_POSN_B3_ENRICHED     DM_EC_POSN_B3_PRORATED 

22-MAY-2017 02:56:00 03:15:46 00:19:46 22-MAY-2017 03:06:43 03:08:38 00:01:55    22-MAY-2017 03:08:43 03:23:14 00:14:31 22-MAY-2017 03:23:27 03:30:07 00:06:40 
23-MAY-2017 03:26:47 03:45:33 00:18:46 23-MAY-2017 03:36:21 03:38:10 00:01:49  23-MAY-2017 03:38:23 04:00:08 00:21:44 23-MAY-2017 04:00:08 04:06:30 00:06:21 

Hinweis: Die Anzahl der Zeilen nicht konstant ist, aber der erste Spaltenname ist für INPUT immer konstant. TXT-Datei.

Schätzen Sie Ihren Vorschlag/Workaround!

Implementierter Code, der von einem der aktiven Mitglieder dieser Gruppe vorgeschlagen wurde.

sed 's/ \+/|/g;s/ $//' file | 
awk -F '|' '{x=$1;$1="";a[x]=a[x]"|" substr($0, 2)} END{for(i in a) print i a[i]}' | 
awk -F '|' '{for (i=1; i<=NF; i++) a[i,NR]=$i; max=(max<NF?NF:max)} END {for (i=1; i<=max; i++) {for (j=1; j<=NR; j++) printf "%s%s", a[i,j], (j<NR?"|":ORS) }}' | 
column -t -s '|' 

Ich erhalte eine Ausgabe wie:

DM_AG_POSN_FDIC_BASE 
22-MAY-2017 02:56:00 
-BLANK- --> There is no output from 2nd line onwards(tried for only one record). Could you please check this ? 
+0

Was ist Ihr Spaltentrennzeichen in INPUT.txt? Tab oder Leerzeichen? – Cyrus

+0

Hallo Cyrus, es ist ein Raum – user7268185

Antwort

1

Hier ist eine, die auf die Eingangsdaten zerbrechlich ist. sort Gruppen die Datensätze, teilt Awk $ 1 und der Rest des Datensatzes auf getrennten Leitungen und rs ist für die Umsetzung der in 3 Reihen mit ziemlich Ausgabe verwendet:

$ awk '{if(p!=$1)print $1;p=$1;sub(p,"",$0);$1=$1}1' <(sort file) | rs -e -t 3 
DM_AG_POSN_FDIC_BASE     DM_EC_CONS_POSN_BASE_HELPER    DM_EC_POSN_B3_ENRICHED     DM_EC_POSN_B3_PRORATED 
22-MAY-2017 02:56:00 03:15:46 00:19:46 22-MAY-2017 03:06:43 03:08:38 00:01:55 22-MAY-2017 03:08:43 03:23:14 00:14:31 22-MAY-2017 03:23:27 03:30:07 00:06:40 
23-MAY-2017 03:26:47 03:45:33 00:18:46 23-MAY-2017 03:36:21 03:38:10 00:01:49 23-MAY-2017 03:38:23 04:00:08 00:21:44 23-MAY-2017 04:00:08 04:06:30 00:06:21 

Jeder Header Maschine zu erwarten ist genau 2 Zeilen von Daten haben, wie in den Beispieldaten. Wenn dies nicht der Fall ist, aktualisieren Sie die Daten, um die tatsächliche Situation besser widerzuspiegeln.

+0

Danke Sir für Ihre Antwort. – user7268185

+0

Hallo Sir, ich habe versucht, Ihren Code zu implementieren, aber für "rs" ist in meinem Terminal nicht identifiziert. Könnten Sie bitte vorschlagen? – user7268185

+0

'rs' macht das Transponieren so, dass Sie es für diese Lösung benötigen. Könnten Sie es vielleicht installieren und davon auch in Zukunft profitieren? 'rs - formt ein Datenarray um, wenn Sie mit' apt-cache' danach suchen: 'apt-cache search rs | Grep^rs. –

Verwandte Themen