/ / Incolla la riga di intestazione in più file tsv (separati da tabulazioni) - linux, bash, unix

Incolla la riga di intestazione in più file tsv (separati da tabulazioni) - linux, bash, unix

Ho più file .tsv nominati come choochoo1.tsv, choochoo2.tsv, ... choochoo(nth).tsv File. Ho anche un main.tsv file. Voglio estrarre la riga di intestazione in main.tsv e incolla sopra tutto choochoo(nth).tsv File. Si prega di notare che ci sono altri .tsv file nella directory che non voglio cambiare o incollare l'intestazione, quindi non posso farlo *.tsv e selezionare tutti i .tsv file (quindi è necessario selezionare choochoo stringa per i file desiderati). Questo è quello che ho provato usando lo script di bash, ma non riuscivo a farlo funzionare. Si prega di suggerire il modo giusto per farlo.

for x in *choochoo; do
head -n1 main.tsv > $x
done

risposte:

1 per risposta № 1

Hai un problema con il file glob, così come il reindirizzamento:

  • il file glob catturerà cose simili AAchoochoo ma no choochoo1.tsv e nemmeno AAchoochoo.tsv
  • il reindirizzamento sovrascriverà i file esistenti invece di aggiungerli. Il comando di reindirizzamento per l'aggiunta a un file è >>, ma questo aggiungerà il testo alla fine e vorrà anteporre il testo all'inizio.

Il problema con il prepending del testo a un esistentefile, è necessario aprire il file sia per la lettura che per la scrittura e quindi eseguire il flusso sia del testo inserito che del testo originale, in ordine - e di solito è dove le persone non riescono perché la shell non può aprire file come questo (c'è un po ' modo più complesso di farlo direttamente, aprendo il file sia per la lettura che per la scrittura, ma non intendo parlarne ulteriormente).

Potresti voler usare un file temporaneo, qualcosa del genere:

for x in choochoo[0-9]*.tsv; do
mv "$x"{,.orig}
(head -n1 main.tsv; cat "$x.orig") > $x
rm "$x.orig"
done