Saya memiliki beberapa file dengan header yang sama dan vektor yang berbeda di bawahnya. Saya perlu menyatukan semuanya tetapi saya hanya ingin header file pertama yang akan digabungkan dan saya tidak ingin header lain digabungkan karena semuanya sama.
misalnya: file1.txt
<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B
C
file2.txt
<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
D
E
F
Saya perlu hasilnya
<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B
C
D
E
F
Saya bisa menulis skrip dalam R tetapi saya membutuhkannya di shell?
grep
(seperti dalam jawaban sputnik ).head -n 10 file1.txt >output.txt && tail -q -n +11 file*.txt >>output.txt
(jika Anda memiliki 10 baris header). Juga, jika file Anda memiliki angka dalam namanya, waspadalah yangfile9.txt
diurutkan antarafile89.txt
danfile90.txt
. Jika file Anda telah nomor sukafile001.txt
, ...,files009.txt
,files010.txt
, ..., makafiles*.txt
akan daftar mereka dalam urutan yang benar.awk 'FNR==1 && NR!=1{next;}{print}' *.csv
Solusi lain, mirip dengan "
cat+grep
" dari atas, menggunakantail
danhead
:Tulis header file pertama ke dalam output:
-
head -2
mendapat 2 baris pertama file.Tambahkan konten semua file:
-
-n +3
membuattail
garis-garis cetak dari 3 ke ujung,-q
memberi tahu untuk tidak mencetak header dengan nama file (bacaman
),>>
menambah file, tidak menimpa sebagai>
.Dan tentu saja Anda dapat menempatkan kedua perintah dalam satu baris:
atau alih-alih
;
menempatkan di&&
antara mereka untuk pemeriksaan sukses.sumber
(head -2 file1.txt ; tail -n +3 -q file*.txt ) > all.txt
atau(head -2 file1.txt && tail -n +3 -q file*.txt ) > all.txt
Coba lakukan ini:
CATATAN
-v
berarti bendera untuk membalikkan pertandingan grep^
dalam REGEX , berarti awal dari string:
Ini adalah teknik mengiris array bash .
sumber
<header>
baris di mana saja di file, bukan hanya di awal. Ini mungkin bukan masalah di sini, tergantung data.grep '^<header>' file1.txt >output.txt && grep -v '^<header>' file*.txt >>output.txt
The
tail
perintah (pada GNU, setidaknya) memiliki opsi untuk melewatkan sejumlah tertentu garis awal. Untuk mencetak dari baris kedua dan seterusnya, yaitu melewati header satu baris, lakukan:tail -n+2 myfile
Jadi, untuk menjaga header dua baris dari file pertama tetapi bukan yang kedua, di Bash:
Atau, untuk banyak file:
Jika string tertentu diketahui ada di semua baris header tetapi tidak pernah di sisa file input,
grep -v
adalah pendekatan yang lebih sederhana, seperti yang ditunjukkan sputnik.sumber
Lebih pendek (tidak harus lebih cepat) dengan
sed
:Ini akan menghapus semua baris yang dimulai dengan
<header>...
mulai dari baris 3, sehingga header pertama dipertahankan dan header lainnya dihapus. Jika ada jumlah baris yang berbeda di header, sesuaikan perintah (mis. Untuk penggunaan header 6-baris7
alih-alih3
).Jika jumlah baris di header tidak diketahui, Anda dapat mencoba seperti ini:
sumber
Dengan asumsi Anda menggunakan folder dengan file .txt dengan header yang sama yang perlu digabungkan / digabungkan, kode ini akan menggabungkan semua file txt menjadi all.txt hanya dengan satu header. baris pertama (baris dipisahkan oleh titik koma) mengumpulkan semua file teks untuk digabungkan, baris kedua menampilkan header dari file txt pertama ke all.txt , dan baris terakhir menggabungkan semua file teks yang dikumpulkan tanpa header (dengan memulai Rangkaian dari baris 2 dan seterusnya) dan menambahkan ke all.txt .
sumber