/ / Coller la ligne d'en-tête dans plusieurs fichiers tsv (séparés par des tabulations) - linux, bash, unix

Coller la ligne d'en-tête dans plusieurs fichiers tsv (séparés par des tabulations) - linux, bash, unix

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 № 1

Vous avez un problème avec le fichier glob, ainsi que la redirection:

  • le fichier glob va attraper des choses comme AAchoochoo mais non choochoo1.tsv et même pas AAchoochoo.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