Làm cách nào để kết hợp tất cả các dòng trong tệp văn bản thành một dòng?


28

Tôi muốn nhận tất cả các dòng trong một văn bản thành một dòng. Tôi là người mới bắt đầu học viết mã đang cố gắng học bằng cách làm. Tôi đã dành bốn giờ để cố gắng giải quyết vấn đề này. Tôi biết có một giải pháp đơn giản cho vấn đề này. Đây là những gì tôi đã cố gắng.

sed -e 'N; s / \ n //' myfile.txt # Không có gì

sed -e: a -e N -e 's / \ n / /' -e ta myfile.txt #output tất cả đã bị rối và tôi không thể tạo ra đầu hay đuôi

mèo myfile.txt | tr -d '\ n'> myfile.txt # Xóa tất cả các dòng

Đây là tệp văn bản:

500212
262578-4-4
23200
CÔNG TY TNHH LAO ĐỘNG GRIFFITH
LAO ĐỘNG GRIFFITH
QUẬN HUYỆN NAM DUBLINE
VĂN PHÒNG
VĂN PHÒNG (CÔNG NGHIỆP)
Danh sách có thể phân loại
2 khu công nghiệp Pineview
Đường Firhouse
Knocklyon
Ngày 31 tháng 12 năm 2007
01 tháng 1 năm 2008 "   

Tôi không thể tìm ra nơi tôi đã sai ....

Câu trả lời:


31

trnhư bạn đã sử dụng, nó sẽ hoạt động và đơn giản nhất - bạn chỉ cần xuất ra tệp khác . Nếu bạn sử dụng tệp đầu vào làm đầu ra, kết quả là một tệp trống như bạn quan sát thấy;

mèo myfile.txt | tr -d '\ n'> oneline.txt

Bạn cần nhớ một số biên tập viên chấm dứt một dòng với \r\n. Đối với trường hợp đó, sử dụng

cat myfile | tr -d '\r\n'

Cảm ơn sự giúp đỡ của bạn nhưng nó vẫn không hoạt động. Tôi biết đó là một cái gì đó cơ bản và đơn giản. Lệnh bạn đã xóa tất cả các dòng. Tôi sẽ gửi file 500.212 262578-4-4 23200 GRIFFITH LABORATORIES LTD GRIFFITH LABORATORIES SOUTH DUBLIN COUNTY COUNCIL VĂN PHÒNG VĂN PHÒNG (INDUSTRIAL) Danh sách có thể định giá 2 Pineview Industrial Estate Firhouse đường Knocklyon 31 tháng 12 năm 2007 01 Tháng Một 2008
John

@JOhn: Kết quả hay lỗi là gì?
ish

Tôi sẽ đăng bằng cách chỉnh sửa câu trả lời của tôi. Sau khi tôi sử dụng lệnh, tập tin trống. Nó trông như thế này trong thiết bị đầu cuối "cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt". Cảm ơn một lần nữa.
Giăng

@ John: Bạn không thể sử dụng cùng tên tệp đầu ra !! (xem câu trả lời). Hãy thửcat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
ish

1
Một cách tốt hơn để làm điều này sẽ là tr -d '\n' <input.txt > output.txt- tránh sử dụng con mèo vô dụng, và sử dụng một đường ống ít cần thiết hơn.
evilsoup

8

Nó đây rồi Đó là một giải pháp khác và đơn giản dễ dàng.

echo $(cat Input.txt) > Output.txt

2
tôi không thể tin điều này đã làm việc, tuyệt vời
mchid

echo `cat Input.txt` > Output.txt hoạt động quá, chỉ là một biến số khác
raider33

Nếu có nhiều hơn một khoảng trắng (khoảng trắng, tab, dòng mới, v.v.) trong một bộ phận duy nhất, chúng sẽ được thay thế bằng một khoảng trắng.
iBug

Đây là một giải pháp tốt, nhưng trên máy tính của tôi, tôi thấy nó mất khoảng ba lần thời gian để làm việc như trgiải pháp.
LS

3

PHƯƠNG PHÁP ĐƠN GIẢN

Một phương pháp khác sử dụng awk,

cat myfile.txt | awk '{print}' ORS=''

Đầu ra:

500212262578-4-423200GRIFFITH CÔNG TY TNHH LAO ĐỘNG

Chú thích:

ORS = '' -> Đây là dấu tách trường của bạn, bạn có thể có bất kỳ ký tự nào ở giữa các dấu ngoặc đơn dưới dạng dấu tách trường. Sử dụng phương pháp awk này, chúng ta có thể bao gồm khoảng trắng và tất cả các ký tự.

Hy vọng điều này có thể giúp!


1
ORS là Dấu tách bản ghi đầu ra. OFS là Dấu tách trường đầu ra. Xem thegeek ware.com / 2010/01 / Từ hoặcman awk
Elder Geek

3

Không cần đặt nhãn :abên ngoài hướng dẫn chính, cũng không phải là -etùy chọn cần thiết; cuối cùng, /$/là không cần thiết (mỗi dòng có một ký tự EOL).

Cải thiện các câu trả lời khác, người ta nhận được

sed -i ':a; N; s/\n/ /; ta' file

Cái nào rõ ràng hơn nếu được viết như sau,

sed -i ':a
        N
        s/\n/ /
        ta' file

Lệnh này hoạt động như sau:

  1. N nối thêm dòng tiếp theo vào không gian mẫu (multiline), đã chứa dòng hiện tại;
  2. s/\n/ /thay thế ký tự dòng mới \nđược tạo bởi Nmột khoảng trắng ;
  3. tađi đến dòng tập lệnh theo nhãn :a miễn là thay thế ở bước 2 thành công , tức là nếu thay thế xảy ra, thực thi sẽ nhảy sang bước 1 mà không "nhấn" phần cuối của tập lệnh, tức là không đọc dòng đầu vào khác.

Lưu ý những điều dưới đây;

  • sedđọc từng dòng của tệp đầu vào theo thứ tự, bắt đầu từ dòng thứ 1 ;
  • :a chỉ là một nhãn hiệu, không phải là một lệnh được thực thi;
  • N về nguyên tắc, được thực hiện trên bất kỳ dòng nào, nhưng
  • s/\n/ /(về nguyên tắc được thực hiện trên bất kỳ dòng nào) là thành công trên bất kỳ dòng nào, nhưng dòng cuối cùng , vì vậy
  • talàm cho phần cuối của tập lệnh chỉ có thể truy cập khi dòng đầu vào cuối cùng được đọc (dòng duy nhất skhông thành công), vì vậy
  • không có dòng đầu vào nào được đọc vào không gian mẫu sau khi dòng thứ nhất được đọc vào nó, trừ khi dòng cuối cùng được đọc, nhưng sau đó không có dòng nào nữa để đọc và plệnh ẩn được thực thi.

Vì vậy, kịch bản về cơ bản đọc trong dòng đầu vào thứ nhất và tiếp tục nối tiếp từng dòng sau, mỗi lần thay thế dòng mới bằng một khoảng trắng; sau khi dòng cuối cùng được nối (và \nthay đổi trong một khoảng trắng), Nkhông thể nối thêm bất kỳ dòng nào, skhông thành công, tabị bỏ qua, kết thúc tập lệnh và pcâu lệnh rint ngụ ý được thực thi trên không gian mẫu 1 dòng hiện tại .

Các -itùy chọn thay thế các tập tin đầu vào filevới toàn bộ không gian mẫu 1-line.


2

GEDIT:

Tìm kiếm và thay thế \nbằng một khoảng trắng ''.
Bạn có thể nhận được cửa sổ thay thế bằng cách đi tới 'Tìm kiếm' -> 'Thay thế'
hoặc thông qua phím tắt keybpard Ctrl+H

Xem ảnh chụp màn hình bên dưới:

Văn bản gốc của bạn nằm trên dòng 1-14.
Kết quả là trên dòng 16.

nhập mô tả hình ảnh ở đây




0

Tôi nghĩ rằng bạn chỉ đơn giản là quên rằng bạn cần nói với sed để chuyển hướng đầu ra của yourfile.txt đến kết quả mong muốn, newfile.txt. Đây dường như là lệnh bạn cần, nhưng chỉ khi các tệp bạn đang cố gắng hợp nhất không quá lớn đối với bộ đệm của sed : sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt. Tín dụng cho một diễn đàn khác ở đây , nơi họ thảo luận về khả năng của sed. Tôi đã thử lệnh và nó đã làm việc cho tôi.


1
Trên thực tế, sed với công -itắc sẽ sửa đổi nội tuyến của tệp gốc , do đó không cần phải xuất ra tệp khác. Hãy cẩn thận!
ish

Tôi đã thử sed -e: a -e N -e 's / \ n / /' -e ta reval_details.asp? Pno = 500214.txt 01 tháng 1 năm 2008addustrial Estate sed -i: a -e N -e 's / \ n / / '-e ta reval_details.asp? Pno = 500214.txt sed: không thể tìm thấy nhãn để chuyển sang a' sed -i :a -e N -i 's/\n/ /' -e ta reval_details.asp?Pno=500214.txt sed: can't find label for jump to ' sed -e: a -e N -i 's / \ n / /' -e ta reval_details .asp? Pno = 500214.txt sed: không thể đọc s / \ n / /: Không có tệp hoặc thư mục như vậy #Any ý tưởng.
Giăng

@Mik Tôi vẫn không gặp may nhưng cảm ơn vì đã trả lời.
Giăng

Tôi sao chép và dán văn bản của bạn vào một trình soạn thảo văn bản và lưu tệp sau đó sử dụng lệnh sed của tôi và nó làm cho tất cả xuất hiện trên một dòng khi được mở bằng nano; tuy nhiên nếu bạn mở tệp bằng cách sử dụng con mèo trong thiết bị đầu cuối thì nó sẽ được bọc và dường như không phải là một dòng, vì vậy có lẽ đó là những gì đang xảy ra. Ngoài ra, bạn không cần 'trước sed và tôi nghĩ bạn đã thêm một số yếu tố không cần thiết khác vào lệnh trên, vì vậy hãy thử sed -e: a -e N -e' s / \ n / / '-e ta yourfile.txt> newfile.txt Dòng quá dài sẽ xuất hiện được bao bọc trên màn hình, trừ khi bạn có màn hình trên 30 inch!

@Mik Chúc mừng cho bài viết. Tôi đã nhập dữ liệu của mình vào trình soạn thảo văn bản đã lưu nó và chạy 'sed -e: a -e N -e' s / \ n / / '-e ta abc.txt> abc1.txt' và nó đã hoạt động. hoàn hảo Hallelujah. Sau đó tôi đã gõ 'sed -e: a -e N -e' s / \ n / / '-e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt' và mỗi dòng ngoài dòng đầu tiên có một không gian thêm vào đầu dòng. Tôi đánh giá cao nỗ lực của bạn nhưng tôi nghĩ tôi sẽ chuyển sang quãng tám và thử và xử lý dữ liệu ở đó.
Giăng

0

Dung dịch bash nguyên chất:

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt

0

Nếu là tôi, tôi chỉ cần mở nó trong vim và nhấn Shift+ Jmột vài lần.



0

Cách tiếp cận Python:

python -c "import sys; print(' '.join([ l.strip() for l in sys.stdin.readlines() ]))" < input.txt

GIẢI THƯỞNG:

awk '{printf "%s ",$0}' /etc/passwd  
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.