web-dev-qa-db-fra.com

Ajout d'une colonne de valeurs dans un fichier délimité par des tabulations

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.

18
Ron

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:

  • Utilisation de l'indicateur -i Avec sed pour effectuer un remplacement sur place, en écrasant le fichier
  • Effectuez une substitution avec s/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.
23
janos

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

12
yegle

Vous pouvez utiliser awk:

awk '{print $0, FILENAME}' file1 file2 file3 ...
11
cuonglm