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 une tabulation et le nom du fichier.
Explication :
- Utiliser le
-i
drapeau avecsed
pour effectuer un remplacement sur place, en écrasant le fichier - Effectuer une substitution avec
s/PATTERN/REPLACEMENT/
. Dans cet exemple, le MOTIF est$
, la fin de la ligne, et REMPLACEMENT est\t
(=une TAB), et$f
est le nom du fichier, de la variable de boucle. Les///
commande est entre guillemets pour que le shell puisse développer les variables.
Allez pourquoi vous recommandez ces outils puissants quand il y a paste
commande !
$ cat a
A
B
C
D
$ cat b
1
2
3
4
$ paste a b
A 1
B 2
C 3
D 4
Avec un peu de ruse, vous pourriez utiliser paste
aux fins du PO. 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 collera le nom de fichier respectif dans la dernière colonne de chaque fichier dans le nouveau fichier filename.new
Vous pouvez utiliser awk
:
awk '{print $0, FILENAME}' file1 file2 file3 ...