1 votes

récupérer une 9ème colonne de données de plusieurs fichiers et les transférer dans un nouveau fichier

OK les gars, j'ai 24 sous-dossiers, nommés Angle1, Angle2, etc jusqu'à Angle24, chacun avec un fichier appelé output.txt. Notez que ces dossiers ont des sous-dossiers que je veux ignorer.

Existe-t-il un moyen de parcourir ces dossiers en boucle et de prendre la 9ème colonne de données (pas la 9ème colonne par caractère, les données peuvent comporter plusieurs caractères mais chaque colonne est séparée par un espace). Et mettre chaque 9ème colonne de tous les fichiers output.txt dans un nouveau fichier appelé total.txt dans le répertoire parent ? Donc je vais finalement avoir un fichier appelé total.txt avec 24 colonnes de données, où la première colonne correspond à la colonne 9 de output.txt dans Angle1, etc.

J'ai besoin que cela soit fait en powershell.

0voto

STTR Points 6623

Ligne de commande powershell, créer un répertoire, exécuter à D:\Data Set\ :

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

ligne de commande powershell, créer des données de test :

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 - Créer un objet aléatoire
  • $s.Trim() - supprime les espaces à gauche et à droite de la chaîne.

Exécuter le fichier powershell :

powershell .\PasteD.ps1

PasteD.ps1, obtenir et écrire la colonne :

$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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X