Làm cách nào để phân chia văn bản giữa dấu phân cách thành nhiều tệp?


7

Tôi có một tập tin văn bản bao gồm những điều sau đây:

"random
textA"
"random
random
textB"

Dấu phân cách là "

Làm cách nào tôi có thể chia phần tiếp theo thành nhiều tệp như sau bằng cách sử dụng lệnh bash?

Tệp 1:

random
textA

Tệp 2:

random
random
textB

Tôi đã đưa ra các ví dụ bằng cách sử dụng csplithoặc awknhưng chúng không bao gồm bố cục văn bản này.


Đó có phải là văn bản duy nhất trong tập tin?
Hauke ​​Laging

có chỉ văn bản trong tệp
Fabio

Câu trả lời:


5

awkLệnh đơn giản :

awk 'NR%2==0{ print > "File "++i }' RS='"' file

RSđịnh nghĩa "là dấu phân cách bản ghi và NRlà số bản ghi. Nếu số bản ghi là modulo bằng 2 (vì chúng tôi có "bản ghi khác trước cho bản ghi), sau đó in bản ghi hiện tại $0thành a File #.


1
Đây là IMO câu trả lời tốt nhất vì nó hoạt động ngay cả khi các dòng khác tồn tại giữa "$và tiếp theo ^".
don_crissti

không cần bắt đầu chỉ sử dụng ++ithay vì i++. Có thể rút ngắn thànhawk 'NR%2==0{ print >"File "++i }' RS='"' file

@Jidder Uh, vâng. cảm ơn bạn. cập nhật với điều đó,
αғsнιη

4

Nếu trích dẫn mở luôn ở đầu dòng, csplit sẽ hoạt động tốt như thế này:

bash$ csplit /tmp/data '/^"/'

Điều đó tạo ra các tệp được gọi là xx00, v.v ... Lưu ý, ví dụ của bạn sẽ xóa các dấu ngoặc kép và điều này thì không. Bạn sẽ cần một dòng lệnh sed để làm điều đó:

bash$ for file in xx* ; do { sed 's/^"//;s/"$//;' ${file} >x${file}; } ; done

Với coreutils csplit: csplit -z filesample '/^"/' {*}để phân tách nhiều lần và bỏ qua phần đầu tiên ( xx00) sẽ luôn trống (đối với mẫu văn bản đã cho).
don_crissti

3

Với GNU awk

awk -v RS='"[[:space:]]*"' '
{sub(/^"|"[[:space:]]*$/, "");print > "output." ++n; close("output." n)}' file.txt

Một thay thế:awk -v RS='"' '!/^[[:space:]]*$/ {print > "output." n++; close...}'
muru

2

Bạn có thể làm:

awk -v RS=\" -v ORS= \
  '{ sub(/^\n*/,"");sub(/\n*$/,""); };
  /^\n*$/ { next;};
  { if(strcnt==0) { print $0 >"file1"; strcnt++;} else
  { print $0 >"file2"; }; }' file
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.