Tách các dòng của tệp văn bản thành các tệp riêng biệt


7

Tôi có một tệp văn bản trông giống như thế này:

foo
bar
zip
rar
tar

Tôi cần sử dụng tập lệnh bash trên OSX để tạo tệp văn bản mới sau mỗi dòng mới như thế này:

cat text1.txt
foo
cat text2.txt
bar
cat text3.txt
zip
cat text4.txt 
rar
cat text5.txt
tar

Câu trả lời:


8

Bạn có thể sử dụng csplit. Nó thực hiện công việc tốt, ngoại trừ việc nó hơi không linh hoạt đối với tên tệp đầu ra (bạn chỉ có thể chỉ định tiền tố, không phải là hậu tố) và bạn cần vượt qua đầu tiên để tính số lượng mảnh.

csplit -f text -- input.txt '//' "{$(wc -l input.txt)}"
for x in text[0-9]*; do mv -- "$x" "$x.txt"; done

Phiên bản GNU, nhưng không phải phiên bản OSX, có các phần mở rộng giải quyết cả hai vấn đề.

csplit -b '%d.txt' -f text -- input.txt '//' '{*}'

Ngoài ra, nếu csplitquá không linh hoạt, bạn có thể sử dụng awk.

awk '{filename = sprintf("text%d.txt", NR); print >filename; close(filename)}' input.txt

awk: text18.txt makes too many open files input record number 18, file ~/Desktop/namnlös mapp/flash varibales3.txt source line number 1
DisplayName

@DisplayName Ooops có, các tập tin cần phải được đóng lại. Đã chỉnh sửa.
Gilles 'SO- ngừng trở nên xấu xa'

2

Phiên bản với bash thuần ...

unset i; while read -r l; do echo $l > "text$((++i)).txt";done < text_file.txt

1

Giả sử nội dung của tệp văn bản không chứa khoảng trắng, bạn cũng có thể sử dụng vòng lặp for trong Bash.

$ for x in $(<file.txt); do echo "$x" > text$((++i)).txt; done

Thí dụ

$ cat file.txt 
foo
bar
zip
rar
tar

Bây giờ với $iunset.

$ unset i
$ for x in $(<file.txt);do echo "$x" > text$((++i)).txt;done
$ ls -l text*
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text1.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text2.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text3.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text4.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text5.txt

Xác nhận kết quả:

$ head text*
==> text1.txt <==
foo

==> text2.txt <==
bar

==> text3.txt <==
zip

==> text4.txt <==
rar

==> text5.txt <==
tar
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.