Làm thế nào để tập tin mèo lại với nhau, thêm dòng mới bị thiếu ở cuối một số tệp


8

Tôi có một loạt các .texttập tin, hầu hết trong số đó kết thúc với nl tiêu chuẩn.

Một cặp vợ chồng không có bất kỳ kẻ hủy diệt cuối cùng. Byte vật lý cuối cùng là (nói chung) một ký tự chữ và số.

Tôi đang sử dụng cat *.text >| /tmp/joined.text, nhưng sau đó nhận thấy một vài vị trí trong tham gia.text nơi dòng đầu tiên của tệp xuất hiện ở cuối dòng cuối cùng của tệp trước đó. Kiểm tra các tập tin trước đó, tôi thấy không có một dấu kết thúc dòng - giải thích nối.

Điều đó đặt ra câu hỏi, cách dễ nhất để kết nối, gắn bó với dòng mới bị thiếu là gì? Còn những lựa chọn này thì sao?

  1. Một giải pháp có thể có hiệu quả thêm một dòng trống vào một số tệp đầu vào. Đối với tôi, đó không phải là vấn đề vì việc xử lý tham gia.text có thể xử lý nó.
  2. Một giải pháp chỉ thêm cr / fl vào các tệp chưa kết thúc theo cách đó.

1
An toàn nhất là thêm dòng mới bị thiếu, ví dụ unix.stackexchange.com/questions/31947/ Đổi hoàn toàn không an toàn là để lại các tệp bị hỏng xung quanh sau đó tự hỏi tại sao một vỏ whilebị bỏ qua những dòng cuối bị hỏng.
thrig

Bạn có thực sự muốn một cr / lf hoặc bạn muốn bình thường, tiêu chuẩn \n? Trên các hệ thống * nix, các dòng kết thúc bằng một \n. Đây \r\nlà một điều Windows. Và bạn muốn điều này ở đâu? Cuối mỗi dòng? Sự kết thúc của tập tin?
terdon

@thrig Nhưng tập tin cụ thể nào? Nói cách khác, đâu là cách tốt để tự động xác định chúng (thay vì mở từng ứng cử viên)? Và nếu một cái khác vô tình được tạo ra, thì một phương thức tự động sẽ trở nên tuyệt vời hơn!
HiTechHiTouch

@terdon Cảm ơn đã bắt. Cửa sổ di sản của tôi hiển thị ... Các nl chỉ xuất hiện ở phần cuối của tệp không có. Mỗi dòng trong một tệp đa dòng kết thúc bằng nl, ngoại trừ dòng cuối cùng. Có lẽ bởi vì một số biên tập viên đã bỏ nó.
HiTechHiTouch

@terdon ý tưởng đó sẽ hoạt động cho Tùy chọn 1, tuy nhiên cách tôi đọc công cụ tìm kiếm, '% s \ n' sẽ nối thêm kích thước của tệp. Có lẽ chỉ muốn '\ n'?
HiTechHiTouch

Câu trả lời:


12

Một lệnh khác có thể thêm dòng mới nếu cần là awk, vì vậy:

awk 1 ./*.txt

Cách 1 ở đây là cách đơn giản nhất để có được một điều kiện thực trong awk, hoạt động cho mục đích này vì hành động mặc định của awk trên các điều kiện thực là in các dòng đầu vào.


Xin chào @muru, bạn có thể giải thích một chút "awk 1" nghĩa là gì không?
Jon

2
Hành động mặc định của @Jon awk trên các điều kiện thực là in các dòng đầu vào và 1là điều kiện đúng đơn giản nhất. Đó là viết tắt củaawk '{print}'
muru

4

Với một số cuttriển khai như GNU cut, bạn có thể làm:

cut -b 1- ./*.text > output

vì nó sẽ thêm dòng mới bị thiếu nếu thiếu.


3

Công cụ một lớp Perl tiện dụng này chỉ có thể thực hiện công việc thêm dòng mới bị thiếu nếu chưa có:

perl -lpe '' ./*.text > output

1

Cách tiếp cận đầu tiên xuất hiện trong đầu là lặp lại các tệp và chỉ in nội dung của chúng với một dòng mới được nối thêm:

for f in *text; do
    printf '%s\n' "$(cat < "$f")"
done > /tmp/joined.text

Các $()sẽ tước bất kỳ ký tự xuống dòng đã tồn tại vì vậy đây sẽ cho kết quả chỉ trong vòng một \nvào cuối mỗi file.


Đừng muốn loại bỏ các NL hiện có - điều đó sẽ chạy tất cả các dòng với nhau, kết hợp vấn đề của tôi. Những gì tôi nghe bạn nói với tôi là cho Tùy chọn 1, chỉ cần lặp qua tất cả các tệp, in từng tệp sau đó là NL. Tôi không ngạc nhiên rằng đó không phải là thứ gì đó trong một tiện ích hiện có để buộc một dòng mới khi cần thiết để các dòng không chạy cùng nhau.
HiTechHiTouch

@HiTechHiTouch điều này sẽ loại bỏ bất kỳ hiện có \n thêm một. Kết quả sẽ luôn là một (và chỉ một) \nở cuối mỗi tệp. Đây %slà một printfđiều, nó chỉ có nghĩa là "chuỗi". Xem ở đây . Bạn đang nhầm lẫn nó với [ -s file ]kích thước của tập tin. Điều này thực hiện cả tùy chọn 1 và tùy chọn 2. Đối với một tiện ích, không có vì không có chương trình nào ghi vào tệp luôn thêm một dòng mới. Nếu không có, điều đó gần như luôn luôn là do một cái gì đó bị hỏng và tập tin bị hỏng.
terdon

1
Lưu ý rằng nó thêm một dòng trống cho các tệp trống (hoặc các tệp không thể mở để đọc). Trong các shell khác zsh, nó sẽ bóp nghẹt các ký tự NUL. Có lẽ cũng nên lưu ý rằng nó tải toàn bộ tệp trong bộ nhớ.
Stéphane Chazelas

0

Bạn có thể sử dụng điều này:

grep -h "" ./*.txt

-h sẽ xóa bản in tên tệp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.