J'ai plusieurs fichiers .tsv nommés comme choochoo1.tsv
, choochoo2.tsv
, ... choochoo(nth).tsv
des dossiers. J'ai aussi un main.tsv
fichier. Je veux extraire la ligne d'en-tête dans main.tsv
et coller sur tout choochoo(nth).tsv
des dossiers. S'il vous plaît noter qu'il y a d'autres .tsv
les fichiers dans le répertoire que je ne veux pas changer ou coller en-tête, donc je ne peux pas *.tsv
et sélectionnez tous les .tsv
fichiers (donc besoin de sélectionner choochoo
chaîne pour les fichiers recherchés). C'est ce que j'ai essayé d'utiliser le script bash, mais je n'ai pas réussi à le faire fonctionner. S'il vous plaît suggérer la bonne façon de le faire.
for x in *choochoo; do
head -n1 main.tsv > $x
done
Réponses:
1 pour la réponse № 1Vous avez un problème avec le fichier glob, ainsi que la redirection:
- le fichier glob va attraper des choses comme
AAchoochoo
mais nonchoochoo1.tsv
et même pasAAchoochoo.tsv
- la redirection remplacera les fichiers existants au lieu de les ajouter. La commande de redirection pour ajouter à un fichier est
>>
, mais cela ajoutera du texte à la fin et vous voudrez ajouter du texte au début.
Le problème avec l'ajout de texte à un existantfichier, c’est que vous devez ouvrir le fichier à la fois en lecture et en écriture, puis diffuser dans l’ordre - à la fois - le texte ajouté et le texte ajouté - et c’est généralement là où les gens échouent, car le shell ne peut pas ouvrir les fichiers de cette manière manière plus complexe de le faire directement, en ouvrant le fichier à la fois en lecture et en écriture, mais je ne vais pas en parler davantage).
Vous voudrez peut-être utiliser un fichier temporaire, quelque chose comme ceci:
for x in choochoo[0-9]*.tsv; do
mv "$x"{,.orig}
(head -n1 main.tsv; cat "$x.orig") > $x
rm "$x.orig"
done