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 № 1Hai un problema con il file glob, così come il reindirizzamento:
- il file glob catturerà cose simili
AAchoochoo
ma nochoochoo1.tsv
e nemmenoAAchoochoo.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