Gabungkan tiga file menjadi satu file master dengan mengecualikan header di file 2 dan 3

8

Saya memiliki tiga file dengan n jumlah baris seperti yang diberikan di bawah ini

sample1.txt

------------------------------
Date        Time    Name    
------------------------------
2013/10/12  12:09:09    Krish
2013/10/12  13:12:01    Ramb
2013/10/12  15:28:39    Likha
2013/10/12  15:56:12    Mat
.
.
.

Sample2.txt

------------------------------
Date        Time    Name    
------------------------------
2013/10/12  11:19:21    Jack
2013/10/12  12:11:09    Rob
2013/10/12  15:45:12    Rick
2013/10/12  22:11:10    Phil
.
.
.

Sample3.txt

------------------------------
Date        Time    Name    
------------------------------
2013/10/12  12:09:09    Eric
2013/10/12  13:12:01    Bob
2013/10/12  15:28:39    Mike
2013/10/12  15:56:12    Nick
.
.
.

Saya perlu menggabungkan ketiga file ini dalam satu file (Master.txt) dengan mengecualikan header (3 baris pertama) di Sample2.txt dan Sample3.txt seperti yang diberikan di bawah ini

Output yang Diinginkan

$cat Master.txt

------------------------------
Date        Time    Name    
------------------------------
2013/10/12  12:09:09    Krish
2013/10/12  13:12:01    Ramb
2013/10/12  15:28:39    Likha
2013/10/12  15:56:12    Mat
2013/10/12  11:19:21    Jack
2013/10/12  12:11:09    Rob
2013/10/12  15:45:12    Rick
2013/10/12  22:11:10    Phil
2013/10/12  12:09:09    Eric
2013/10/12  13:12:01    Bob
2013/10/12  15:28:39    Mike
2013/10/12  15:56:12    Nick

Catatan: Di mesin AIX dengan Ksh 88

Ram
sumber
4
Ini mungkin paling baik dilakukan secara terprogram. Mungkin menggunakan Python dan Perl. Jika Anda sering melakukan hal-hal seperti itu, Anda dapat mempertimbangkan untuk menggunakan R. R akan memungkinkan Anda mengimpor file individual sebagai bingkai data, dan kemudian Anda dapat menggabungkan frame data tersebut menjadi satu. Saya percaya panda Python misalnya menawarkan fungsionalitas yang serupa, tetapi saya belum menggunakannya.
Faheem Mitha
@FaheemMitha Perl / Python tentu saja membutuhkan banyak tenaga untuk ini. Ditambah Python di AIX mungkin sedikit bermasalah.
peterph
@ Peterf Yah, mungkin. Tetapi jika dia harus sering melakukan manipulasi seperti itu, maka pendekatan R harus banyak merekomendasikannya. Meskipun saya tidak tahu tentang status R pada AIX saat ini. Meskipun R dari hampir semua vintage harus dapat melakukan manipulasi semacam ini.
Faheem Mitha
1
@FaheemMitha mengapa Anda merekomendasikan R untuk ini? Semua kebutuhan OP adalah menghapus 3 baris teratas dari semua kecuali file pertama. Dengan antarmuka berbasis teks UNIX yang kuat, ini berfungsi untuk utilitas standar.
peterph
1
@ Peterf Yah, itu tidak perlu untuk manipulasi khusus ini, tetapi tampaknya poster perlu memanipulasi tabel teks, dan secara umum R adalah cara yang baik untuk melakukannya, dan mungkin skala lebih baik untuk situasi yang lebih kompleks. Pendekatan alternatif menggunakan alat unix tentu layak. Saya tidak menyarankan itu cara yang buruk untuk pergi.
Faheem Mitha

Jawaban:

18
{ cat sample1.txt; tail -n +4 sample2.txt; tail -n +4 sample3.txt; } > out.txt
Stéphane Chazelas
sumber
@Stephane Chazelas: Menyesal atas komentar sebelumnya. Terima kasih ini bekerja dengan sempurna seperti yang diharapkan .. !!!
Ram
1
@ram tail -n +4artinya, terlepas dari ukuran file, 3 baris teratas dikecualikan. Saya baru saja mencobanya dengan 10 line fie. Jangan mencampur "4" di sini dengan fakta bahwa sampel Anda memiliki 4 baris. Itu pada dasarnya kebetulan.
Michael Durrant
@ram :) untuk kelengkapan, headmemiliki opsi serupa: -n -Xakan mencetak semua kecuali X baris terakhir .
peterph
2
@peterph, bukan pada AIX, tidak dalam spesifikasi POSIX (hanya angka positif yang diizinkan)
Stéphane Chazelas
Hm, salahku ... ini adalah ekstensi GNU.
peterph
7
sed '4,${/^---/d;/^Date/d;}' sample1.txt sample2.txt sample3.txt > out.txt
peterph
sumber
2
+1 tetapi dapatkah Anda menambahkan sedikit penjelasan? Apa yang dilakukan dengan ${}sintaks sed?
terdon
Itu tidak ${}, tetapi "lakukan {...}pada baris 4 untuk bertahan"; itu menghapus garis yang cocok, tetapi hanya setelah header pertama berlalu. Namun, menggunakan ekor lebih umum dan lebih kuat.
alexis
@terdon seperti yang dikatakan, {}adalah pengelompokan perintah.
peterph
@alexis tergantung pada apa yang Anda inginkan pada akhirnya. Salah satu keuntungan (tidak begitu penting akhir-akhir ini) adalah hanya menghasilkan satu proses. Selain itu, Anda dapat dengan mudah membuatnya menjadi skrip dengan #!/bin/sedmenjadi juru bahasa.
peterph