2012-08-27 33 views
5

Tôi có hai tệp csv/văn bản mà tôi muốn tham gia. Cả hai đều chứa cùng một dòng đầu tiên. Tôi đang cố gắng tìm ra cách sử dụng sed và cat để tạo ra một tệp được hợp nhất, nhưng chỉ với một bản sao của dòng đầu tiên. Và tôi có một thời gian với cú pháp. Bất kỳ trợ giúp sẽ được đánh giá rất nhiều :-D! Cảm ơn, AndrewFile1 + (File2 - dòng đầu tiên)> File3

Trả lời

4

này sẽ kết hợp các file data1.txtdata2.txt trong tập tin merged.txt, bỏ qua dòng đầu tiên từ data2.txt. Nó sử dụng awk nếu bạn là ok với nó:

(cat data1.txt; awk 'NR>1' data2.txt) > merged.txt 

awk gắn tất cả các dòng với số dòng> 1 từ tập tin data2.txt nộp merged.txt.

NR là biến được xây dựng sẵn, viết tắt của số dòng hiện tại của tệp đang được xử lý. Nếu biểu thức Boolean NR > 1 là true, awk sẽ in dòng ngầm.

Nếu bạn không quan tâm về việc giữ gìn data1.txt còn nguyên vẹn, bạn chỉ có thể thêm tập tin thứ 2 của bạn (trừ dòng đầu tiên của nó) và giảm xuống còn này:

awk 'NR>1' data2.txt >> data1.txt 
+2

Hoặc, bạn có thể sử dụng 'đuôi -n + 2' thay vì 'awk' NR> 1''. –

+0

@ TannerL.Swett Neat .. Tôi đã suy nghĩ đầu tiên của việc sử dụng 'đầu' hoặc' đuôi' bằng cách nào đó, nhưng tôi đã chắc chắn về cách làm điều này với 'awk'. Và dĩ nhiên nếu OP không quan tâm đến việc giữ 'data1.txt' thì giải pháp có thể bỏ qua lệnh đầu tiên và chỉ nối thêm tệp thứ hai (dòng thứ nhất) vào tệp đó. – Levon

4

Một tùy chọn khác với awk:

awk 'NR==FNR || FNR>1' file1.txt file2.txt .. fileN.txt 

Điều này in tất cả các dòng trong tệp đầu tiên HOẶC bất kỳ dòng nào trong các tệp tiếp theo sau dòng đầu tiên.

+0

điều gì sẽ xảy ra nếu tôi làm điều này: 'awk 'NR == FNR || FNR> 1 '* .txt' –

+0

Bạn sẽ dựa vào thứ tự các tệp được khớp với tập tin globbing. Nếu tất cả chúng đều chứa các dòng đầu tiên giống nhau, thì điều này sẽ an toàn. Tại sao bạn không thử nó và xem điều gì xảy ra? – ghoti

1

giải quyết với một dòng '1 d' có nghĩa là xóa dòng đầu tiên trong file2

lệnh sau sẽ nối kết quả để file1

sed '1 d' file2 >> file1 
+0

Bạn đang sửa đổi cả hai 'file1' và' file2' bằng lệnh này - điều này có thể hoặc có thể không ổn với OP. Tốt hơn là cung cấp cả hai tùy chọn (một tùy chọn khác không thay đổi một trong hai tệp gốc). – Levon

+0

@Levon: không, bạn không sửa đổi 'tệp2' tại đây. – tripleee

+0

@tripleee Chỉ cần thử nghiệm nó, nó không * xóa * nhưng thay vì không * hiển thị * dòng đầu tiên .. đã nhận nó. Có lẽ có thể được phrased tốt hơn trong câu trả lời mặc dù. – Levon

2

tôi muốn nói là giải pháp đơn giản nhất là:

(cat file1.txt ; tail -n +2 file2.txt) > file3.txt 

Có ưu điểm là chỉ rõ những gì bạn đang làm: in toàn bộ tệp đầu tiên, sau đó in tất cả trừ dòng đầu tiên của cond tập tin, viết đầu ra cho tập tin thứ ba.

+0

Wow !!! Cảm ơn mọi người!!!!!!! :-D –

Các vấn đề liên quan