Mam wiele plików .tsv o nazwie jako choochoo1.tsv
, choochoo2.tsv
, ... choochoo(nth).tsv
pliki. Ja też mam main.tsv
plik. Chcę wyodrębnić wiersz nagłówka main.tsv
i wklej wszystko choochoo(nth).tsv
pliki. Pamiętaj, że są inne .tsv
pliki w katalogu, których nie chcę zmieniać lub wklejać nagłówek, więc nie mogę tego zrobić *.tsv
i wybierz wszystkie .tsv
pliki (więc musisz wybrać choochoo
ciąg dla poszukiwanych plików). To właśnie próbowałem użyć skryptu bash, ale nie mogłem go uruchomić. Proszę zaproponować odpowiedni sposób.
for x in *choochoo; do
head -n1 main.tsv > $x
done
Odpowiedzi:
1 dla odpowiedzi № 1Masz problem z plikiem glob, a także z przekierowaniem:
- plik glob złapie takie rzeczy
AAchoochoo
ale niechoochoo1.tsv
a nawet nieAAchoochoo.tsv
- przekierowanie zastąpi istniejące pliki zamiast dodawać je. Polecenie przekierowania do dodania do pliku to
>>
, ale to doda tekst na końcu i chcesz dodać tekst na początku.
Problem z dodawaniem tekstu do istniejącegojest to, że musisz otworzyć plik zarówno do odczytu, jak i zapisu, a następnie przesyłać strumieniowo zarówno dodany tekst, jak i oryginalny tekst, w kolejności - i zwykle tam, gdzie ludzie zawodzą, ponieważ powłoka nie może „otwierać plików w ten sposób (jest trochę bardziej złożony sposób robienia tego bezpośrednio, otwierając plik zarówno do czytania, jak i pisania, ale nie zamierzam dalej tego zajmować.
Możesz użyć pliku tymczasowego, coś takiego:
for x in choochoo[0-9]*.tsv; do
mv "$x"{,.orig}
(head -n1 main.tsv; cat "$x.orig") > $x
rm "$x.orig"
done