Abrufen der 9. Datenspalte aus mehreren Dateien und Speichern aller Daten in einer neuen Datei

Abrufen der 9. Datenspalte aus mehreren Dateien und Speichern aller Daten in einer neuen Datei

OK Leute, ich habe 24 Unterordner mit den Namen Angle1, Angle2 usw. bis Angle24, jeder mit einer Datei namens output.txt. Beachten Sie, dass diese Ordner Unterordner haben, die ich ignorieren möchte.

Gibt es eine Möglichkeit, diese Ordner zu durchlaufen und die 9. Datenspalte zu nehmen (nicht 9. Spalte für Zeichen, die Daten können mehrere Zeichen lang sein, aber jede Spalte ist durch ein Leerzeichen getrennt). Und jede 9. Spalte aus allen output.txt-Dateien in eine neue Datei namens total.txt im übergeordneten Verzeichnis zu setzen? Ich werde also letztendlich eine Datei namens total.txt mit 24 Datenspalten haben, wobei die erste Spalte der Spalte 9 von output.txt in Angle1 usw. entspricht.

Ich muss dies in Powershell erledigen.

Antwort1

Powershell-Befehlszeile, Verzeichnis erstellen, ausführen unter D:\Data Set\:

powershell 1..24^|%{md ('Angle'+$_)}

Powershell-Befehlszeile, Testdaten erstellen:

powershell $i=0;$d='D:\Data Set\';$r=New-Object -T Random;1..24^|%{++$i;1..(random(11..17))^|%{$s='';1..20^|%{$rn=$r.Next();$s+=''+$rn+' '};$s.Trim();$s^|ac ($d+'Angle'+$i+'\output.txt')}}
  • $r=New-Object -T Random - Zufälliges Objekt erstellen
  • $s.Trim() - Leerzeichen links und rechts der Zeichenfolge löschen

Führen Sie die Powershell-Datei aus:

powershell .\PasteD.ps1

PasteD.ps1, Spalte abrufen und schreiben:

$d='D:\Data Set\' # work directory
$FileNum=24       # part path and filename
$Coln=9           # - 9th column
$LineMax=0        # init variable maximum line at text file
$dlm=' '          # delimiter

$i=0;1..$FileNum|%{++$i;$LineMax=[Math]::Max($LineMax,(gc ($d+'Angle'+$i+'\output.txt')|Measure).Count)}
# (gc <file name>|Measure).Count) - get line count at text file
# [Math]::Max - get Maximum line count at all file
# 1..$FileNum - cycle at Angle1, Angle2, etc up to Angle24 directory

# way init array: 

#$arS =,''*$LineMax
#$arS =@('')*$LineMax
#$arS=[array]::CreateInstance('String', $LineMax)
#$arS=New-Object 'object[]' $LineMax
[string[]]$arS=@('')*$LineMax

For($i=0; $i -lt $FileNum-1; $i++) {
$f=gc ($d+'Angle'+($i+1)+'\output.txt') # get content file in Angle1..Angle23 dir

  For($j=0; $j -lt $f.length; $j++) {
  $arS[$j]=$arS[$j] + ($f[$j]-split' ')[$Coln-1] + $dlm # add value and delimiter
  }
  For($j=$f.length; $j -lt $LineMax; $j++) {
  $arS[$j]=$arS[$j] + $dlm # add delimiter and empty value
  }
}

$f=gc ($d+'Angle'+($FileNum)+'\output.txt') # get content file in Angle24 dir

  For($j=0; $j -lt $f.length; $j++) {
  $arS[$j]=$arS[$j] + ($f[$j]-split' ')[$Coln-1] # after last column not add delimiter
  }

$arS|ac($d+'\total.txt') # save string array to result file

verwandte Informationen