2016-06-17 7 views
0

Ich habe eine CSV-Datei in einem Linux-Server, der mehrere Zeilen mit einer Varianz von Feldern hat. Ich möchte sicherstellen, dass alle Datensätze die maximale Anzahl von Spalten (leere Werte) als die Zeile mit der maximalen Anzahl von Spalten haben. Ich muss das in einer Bash-Schrift erreichen. Ich möchte versuchen, awk zu verwenden, wenn möglich, ich bin nur neu zu bash.Stellen Sie sicher, CSV-Datei hat die gleiche Anzahl von Spalten für jede Zeile in Bash

+0

Wie sind Ihre Spalten getrennt? 'awk '{NF = 5} 1' file.txt' teilt jede Zeile in Leerzeichen und druckt die ersten 5 Spalten. Und Sie können '-F 'verwenden, also setzen Sie Komma als Separator. – andlrc

+0

Ja, sie sind durch Kommas getrennt. –

Antwort

3

awk zur Rettung. Sie können alle in einem Skript tun, T. J. die Beispieleingabedatei mit

$ awk -F, -v OFS=, 'NR==FNR{if(max<NF)max=NF;next}; 
          {NF=max}1' file{,} 
1,2,3,4,5, 
1,2,3,4,, 
1,2,3,,, 
1,2,3,4,5,6 

Erläuterung: Dies ist ein Doppeldurchlauf-Algorithmus, in der ersten Runde die max und verwendet in der zweiten berechnet. NR==FNR gilt nur für die erste Datei, berechnet das Maximum, beachten Sie, dass das Max nicht initialisiert werden muss, da der Standardwert Null ist und die Längen nicht negativ sind. next überspringt den Rest des Skripts. In der zweiten Runde füllt die Einstellung NF=max die Datensätze mit weniger Feldern. 1 wird als Kurzschrift für den Ausdruck (oder eine zutreffende Anweisung) basierend auf den awk Standardwerten verwendet. Außerdem wird file{,} zu file file aufgelöst, um die gleiche Datei zweimal für den Double-Pass-Algorithmus zu verwenden.

Das gleiche kann mit Single-Pass-Arrays und END-Block geschrieben werden.

+0

whereis T.J.'s Probe? –

+0

Bravo - beste Antwort! Danke, dass du die Erklärung hinzugefügt hast. –

+0

Arbeitete schön! Vielen Dank! Große Erklärung auch. Ich bin neu in bash, also ist es großartig, wenn jemand erklärt, was vor sich geht, besonders mit awk! –

Verwandte Themen