Mam wiele plików z tym samym nagłówkiem i różnymi wektorami poniżej. Muszę połączyć je wszystkie, ale chcę, aby tylko nagłówek pierwszego pliku był konkatenowany i nie chcę, aby inne nagłówki były konkatenowane, ponieważ wszystkie są takie same.
na przykład: plik1.txt
<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B
C
plik2.txt
<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
D
E
F
Potrzebuję wyjścia
<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B
C
D
E
F
Mógłbym napisać skrypt w R, ale potrzebuję go w powłoce?
grep
(jak w odpowiedzi sputnika ).head -n 10 file1.txt >output.txt && tail -q -n +11 file*.txt >>output.txt
(jeśli masz 10 linii nagłówka). Ponadto, jeśli twoje pliki mają numery w nazwach, strzeż się, żefile9.txt
są posortowane międzyfile89.txt
afile90.txt
. Jeśli pliki zostały numery podobafile001.txt
, ...files009.txt
,files010.txt
..., a następniefiles*.txt
wyświetli je w odpowiedniej kolejności.awk 'FNR==1 && NR!=1{next;}{print}' *.csv
Inne rozwiązanie, podobne do „
cat+grep
” z góry, przy użyciutail
ihead
:Zapisz nagłówek pierwszego pliku w pliku wyjściowym:
-
head -2
pobiera 2 pierwsze linie pliku.Dodaj zawartość wszystkich plików:
-
-n +3
wykonujetail
linie wydruku od 3 do końca,-q
mówi, aby nie drukował nagłówka z nazwą pliku (odczytman
),>>
dodaje do pliku, nie zastępuje go jako>
.I upewnij się, że możesz umieścić oba polecenia w jednym wierszu:
lub zamiast
;
umieszczać&&
między nimi w celu sprawdzenia sukcesu.źródło
(head -2 file1.txt ; tail -n +3 -q file*.txt ) > all.txt
lub(head -2 file1.txt && tail -n +3 -q file*.txt ) > all.txt
Spróbuj to zrobić:
UWAGA
-v
środki flag odwrócić mecz grep^
w REGEX oznacza początek łańcucha:
To technika wycinania tablic bash .
źródło
<header>
linie w dowolnym miejscu w pliku, nie tylko na początku. W zależności od danych może to nie stanowić problemu.grep '^<header>' file1.txt >output.txt && grep -v '^<header>' file*.txt >>output.txt
The
tail
Poleceń (GNU przynajmniej) ma możliwość pominięcia określonej liczby pierwszych linii. Aby wydrukować od drugiej linii, tj. Pominąć nagłówek jednowierszowy, wykonaj:tail -n+2 myfile
Aby zachować dwuwierszowy nagłówek pierwszego pliku, ale nie drugiego, w Bash:
Lub w przypadku wielu plików:
Jeśli wiadomo, że określony ciąg występuje we wszystkich wierszach nagłówka, ale nigdy w pozostałych plikach wejściowych,
grep -v
jest to prostsze podejście, jak pokazał sputnik.źródło
Krótszy (niekoniecznie szybszy) z
sed
:Spowoduje to usunięcie wszystkich linii
<header>...
zaczynających się od linii 3, więc pierwszy nagłówek zostanie zachowany, a pozostałe nagłówki zostaną usunięte. Jeśli w nagłówku jest inna liczba wierszy, odpowiednio dostosuj polecenie (np.7
Zamiast nagłówka użyj 6 wierszy3
).Jeśli liczba wierszy w nagłówku jest nieznana, możesz spróbować w ten sposób:
źródło
Zakładając, że używasz folderu z plikami .txt z tym samym nagłówkiem, który wymaga połączenia / konkatenacji, ten kod połączyłby pliki txt w plik all.txt z jednym nagłówkiem. pierwszy wiersz (linie oddzielone średnikami) zbiera wszystkie pliki tekstowe do konkatenacji, drugie linie generują nagłówek z pierwszego pliku txt do all.txt , a ostatni wiersz konkatenuje wszystkie pliki tekstowe zebrane bez nagłówka (uruchamiając konkatenacja od drugiego rzędu) i dołącza ją do pliku all.txt .
źródło