Comment puis-je ajouter une colonne de valeurs dans un fichier qui a un certain nombre de lignes. J'ai un fichier d'entrée comme celui-ci:
Fichier d'entrée:
SPATA17 1 217947738
LYPLAL1 1 219383905
FAM47E 4 77192838
SHROOM3 4 77660162
SHROOM3 4 77660731
SHROOM3 4 77662248
Fichier de sortie:
SPATA17 1 217947738 file1
LYPLAL1 1 219383905 file1
FAM47E 4 77192838 file1
SHROOM3 4 77660162 file1
SHROOM3 4 77660731 file1
SHROOM3 4 77662248 file1
Dans ce cas, je veux ajouter une colonne de valeurs, jusqu'au nombre de lignes dans le fichier. La valeur reste cohérente, comme "file1".
La raison en est que j'ai 100 de ces fichiers. Je ne veux pas ouvrir chaque fichier et coller une colonne. Il existe également un moyen d'automatiser cela, en allant dans un répertoire et en ajoutant une colonne de valeurs. La valeur provient du nom de fichier, qui doit être ajouté dans chaque ligne du fichier dans la dernière / première colonne.
sed
est le plus pratique pour la substitution de modèles et l'enregistrement sur place. Pour votre besoin d'enregistrer le fichier, c'était une option relativement pratique. Si vous n'avez pas besoin de réécrire dans le même fichier que vous traitez, ilawk
est généralement beaucoup plus facile de travailler avec.awk
trop souvent gêné par les séparateurs de champs d'entrée / sortie, et j'essaie donc d'éviter de l'utiliser autant que possible, ce qui rendsed
plus attrayant.Venez pourquoi vous recommandez ces outils puissants quand il y a
paste
commande!Avec une petite ruse, vous pouvez utiliser
paste
pour le but de l'OP. Cependant, il ne remplacera pas les fichiers en place:Cela va coller le nom de fichier respectif comme dernière colonne de chaque fichier dans un nouveau fichier
filename.new
la source
paste
est sûrement un joyau caché.Vous pouvez utiliser
awk
:la source
FILENAME
est une variable dansawk
, elle se développe jusqu'au nom de fichier en cours deawk
traitement. Vous n'avez qu'à le faire, alimenter tous les fichiersawk
.GNU awk 4.1.0
ou plus tard, vous pouvez utiliser-i
pour éditer sur place. Sinon, vous devez rediriger laawk
sortie vers un fichier temporaire, puis utilisergrep
pour extraire la ligne de chaque fichier.for file in *; do awk 'BEGIN{OFS="\t"}{print $0, FILENAME}' $file; done