2016-09-21 4 views
0

Hilfe zum Konvertieren von Zeilen in Spalten in Unix-Skripts. Meine Quelle ist das Dateisystem.Unix awk scripting zum Konvertieren von Spalten in Zeilen

das unten stehende Skript versucht:

`perl -nle ' 
    if($. == 1) 
    { (@a)=/([\w - .]+)(?=,|\s*$)/g } 
    else 
    { 
     (@b)=/([\w - .]+)(?=,|\s*$)/g; 
     print "$a[0]|$b[0]|$b[1]|$b[2}|$a[$_]|$b[$_+3]" foreach (0..$#a) 
    } 
    ' ip.txt >op.txt 

input data from file: 

src,FI,QMA,PCG,PCC,PREI,G T 
PIM2016.csv,MMR.S T - RED,334,114,120,34,123,725 

Ausgabe mit den neuesten Skript:

SRC | PIM2016.csv | MMRPPS | RED | SRC | 334 SRC | PIM2016.csv | MMRPPS | RED | FI | 114 SDRC | PIM2016.csv | MMRPPS | ROT | QMA | 120 SRC | PIM2016.csv | MMRPPS | ROT | PCG | 34 SRC | PIM2016.csv | MMRPPS | ROT | PCC | 123 SRC | PIM2016.csv | MMRPPS | ROT | PREI | 725 SRC | PIM2016.csv | MMRPPS | ROT | GT |

Erforderliche Ausgabe:

SRC | PIM2016.csv | MMRPPS | ST -RED | FI | 334 SRC | PIM2016.csv | MMRPPS | ST -RED | QMA | 114 SRC | PIM2016. csv | MMRPPS | ST -RED | PCG | 120 SRC | PIM2016.csv | MMRPPS | ST -RED | PCC | 34 SRC | PIM2016.csv | MMRPPS | ST -RED | PREI | 123 SRC | PIM2016.csv | MMRPPS | ST -RED | GT | 725

+2

Vielleicht könnten Sie teilen, was Sie bisher versucht haben und wo Sie gerade kämpfen? – wwkudu

+0

haben Ihre tatsächlichen Daten mehr als zwei Zeilen? Wenn ja, können Sie Ihre Beispieleingabe mit mindestens zwei dieser Daten und der erwarteten Ausgabe ändern? – Sundeep

+0

@Sundeep: Ja tatsächliche Daten als mehr als zwei Zeilen. Ich werde die Beispieldaten ändern – udayadevan

Antwort

0
$ cat ip.txt 
HDR :FI,QA,PC,PM,PRE,G T 
Detail row: MMRPPS,ST - RED,334,114,120,34,123,725 
      UP,UPR,0,0,0,0,0,0 

keine Leerzeilen zwischen den Zeilen Unter der Annahme:

$ perl -nle ' 
s/^.*:\s*|^\s*|\s*$//; 
if($. == 1) 
{ (@a) = /[^,]+/g } 
else 
{ 
    (@b) = /[^,]+/g; 
    print "$b[0] $a[$_] $b[1] $b[$_+2]" foreach (0..$#a); 
} 
' ip.txt 
MMRPPS FI ST - RED 334 
MMRPPS QA ST - RED 114 
MMRPPS PC ST - RED 120 
MMRPPS PM ST - RED 34 
MMRPPS PRE ST - RED 123 
MMRPPS G T ST - RED 725 
UP FI UPR 0 
UP QA UPR 0 
UP PC UPR 0 
UP PM UPR 0 
UP PRE UPR 0 
UP G T UPR 0 
  • Eingangsleitungen sind vorverarbeiteten bis führenden Text zu entfernen: beliebige vordere und hintere Weißräume
  • Von der ersten Zeile, durch Komma getrennte Werte in @a Array extrahieren. Die regex sucht Zeichenfolge von nicht , Zeichen
  • Für alle anderen Linien,
    • gleichen regex Komma getrennte Werte in @b Array
    • Druck in gewünschter Reihenfolge
+0

@ Sundeep: dieses Skript funktioniert, sind erwünscht. Vielen Dank. Aber nimmt nur den zweiten Teil der Wörter, wenn Leerzeichen dazwischen sind (zB: Eingabe: Gesamtsumme, Ausgabe: Summe). Ist es möglich, dies zu lösen? – udayadevan

+0

@udayadevan versuche, '(\ w +)' mit '([\ w] +)' .. zu ersetzen und editiere deine Frage, um diese Beispieldaten wiederzugeben. – Sundeep

0

@sundeep zu extrahieren, : Danke für deine Antwort. Unter dem Skript funktioniert

perl -nle ' 
if($. == 1) 
{ (@a)=/([\w -]+)(?=,|\s*$)/g } 
else 
{ 
    (@b)=/([\w -]+)(?=,|\s*$)/g; 
    print "$b[0] $a[$_] $b[1] $b[$_+2]" foreach (0..$#a) 
} 
' ip.txt 
+2

sehe meine bearbeitete Antwort und [Was soll ich tun, wenn jemand meine Frage beantwortet?] (http://stackoverflow.com/help/someone-answers) – Sundeep

Verwandte Themen