obtener la novena columna de datos de varios archivos y volcarlos todos en un archivo nuevo

obtener la novena columna de datos de varios archivos y volcarlos todos en un archivo nuevo

Bien chicos, tengo 24 subcarpetas, llamadas Angle1, Angle2, etc. hasta Angle24, cada una con un archivo llamado salida.txt. Tenga en cuenta que estas carpetas tienen subcarpetas que quiero ignorar.

¿Hay alguna manera de recorrer estas carpetas y tomar la novena columna de datos (no la novena columna por carácter, los datos pueden tener varios caracteres pero cada columna está separada por un espacio)? ¿Y colocar cada novena columna de todos los archivos output.txt en un nuevo archivo llamado total.txt en el directorio principal? Entonces, finalmente crearé un archivo llamado total.txt con 24 columnas de datos, donde la primera columna corresponde a la columna 9 de output.txt en Angle1, etc.

Necesito que esto se haga en powershell.

Respuesta1

Línea de comandos de PowerShell, crear directorio, ejecutar en D:\Data Set\:

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

Línea de comandos de PowerShell, cree datos de prueba:

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=Nuevo-Objeto -T Aleatorio - Crear objeto aleatorio
  • $s.Trim() - elimina el espacio del lado izquierdo y derecho de la cadena

Ejecute el archivo powershell:

powershell .\PasteD.ps1

PasteD.ps1, obtenga y escriba la columna:

$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

información relacionada