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.
Vous pouvez utiliser une boucle à une ligne comme celle-ci:
for f in file1 file2 file3; do sed -i "s/$/\t$f/" $f; done
Pour chaque fichier de la liste, cela utilisera sed
pour ajouter à la fin de chaque ligne un onglet et le nom du fichier.
Explication:
-i
Avec sed
pour effectuer un remplacement sur place, en écrasant le fichiers/PATTERN/REPLACEMENT/
. Dans cet exemple, PATTERN est $
, La fin de la ligne, et REMPLACEMENT est \t
(= Un TAB), et $f
Est le nom de fichier, à partir de la variable de boucle. La commande s///
Est placée entre guillemets afin que le shell puisse développer des variables.Venez pourquoi vous recommandez ces outils puissants quand il y a la commande paste
!
$ cat a
A
B
C
D
$ cat b
1
2
3
4
$ paste a b
A 1
B 2
C 3
D 4
Avec une petite ruse, vous pouvez utiliser paste
pour le but de l'OP. Cependant, il ne remplacera pas les fichiers en place:
for f in file1 file2 file3; do
paste $f <(yes $f | head -n $(cat $f | wc -l)) > $f.new
done
Cela va coller le nom de fichier respectif comme dernière colonne de chaque fichier dans le nouveau fichier filename.new
Vous pouvez utiliser awk
:
awk '{print $0, FILENAME}' file1 file2 file3 ...