Xóa một dòng cụ thể khỏi một tập tin


7

Đâu đó ở giữa tệp CSV của tôi là dòng này:

Products below this line are out of stockNumber, month, year, reference, store

Lưu ý: Số, tháng, năm, tham chiếu và lưu trữ là các trường CSV.

Làm cách nào để xóa dòng này khỏi tệp bằng lệnh dòng lệnh?

Lưu ý rằng CSV là như thế này

Number, month, year, reference, store
1,1,2014,13322,main
2,2,2014,13322,main
3,3,2011,1322,main
4,4,2012,3322,main
5,4,2013,122,secondary
Products below this line are out of stockNumber, month, year, reference, store
12,411,2010,122,Albany
25,41,2009,122,Dallas
35,24,2008,122,New

3
Điều gì làm cho dòng bạn muốn xóa khác với các dòng khác?
cuonglm

sửa đổi câu hỏi Kiểm tra nó ra.
DuckDucking

Câu trả lời:


17

Cách dễ nhất là sử dụng grep -vlệnh:

grep -v "Products below" your_file.csv > new_file.csv


10

Với dữ liệu đầu vào của bạn, bạn có thể thử:

$ sed '/^Products/d' file 
Number, month, year, reference, store
1,1,2014,13322,main
2,2,2014,13322,main
3,3,2011,1322,main
4,4,2012,3322,main
5,4,2013,122,secondary
12,411,2010,122,Albany
25,41,2009,122,Dallas
35,24,2008,122,New

Sử dụng sed -i.bakđể chỉnh sửa tệp tại chỗ và tạo tệp sao lưu:

sed -i.bak '/^Products/d' file

với một số phiên bản của sedbạn không cần phải làm -i.bakchỉ -isẽ làm (nhưng tất nhiên w / o tập tin sao lưu)
user13107

@ user13107 trong một số phiên bản bạn phải nói -i''về điều đó
SztupY

@SztupY: Trong -i''vỏ nên lột ''và để bạn -imột mình. Ít nhất nếu nó là một vỏ giống như bourne tiêu chuẩn.
MvG

1
@MvG: bỏ lỡ khoảng trống giữa -i''
SztupY

5

Nếu chúng tôi có thể giả định rằng bạn muốn xóa tất cả các dòng bắt đầu bằng Products(bao gồm khoảng trắng sau từ 1), tất cả sẽ hoạt động:

  • ôi

    awk '$1!="Products" file > newfile
    
  • perl

    perl -ne 'print unless /^Products/' file > newfile
    

    hoặc là

    perl -ane 'print if $F[0]!="Products"' file > newfile
    

    hoặc, để chỉnh sửa tệp tại chỗ

    perl -i -ne 'print unless /^Products/; ' file
    perl -i -ane 'print if $F[0]!="Products"' file 
    
  • grep (đây chỉ là một phiên bản ngắn hơn của câu trả lời của Svq )

     grep -v ^Products file > newfile
    
  • bash (chỉ cho niềm vui của nó)

    while read line; do [[ $line =~ ^Products ]] || echo $line; done <  file > newfile
    

5

tại chỗ với ed(trên bashdấu nhắc)

ed -s file <<<$'/Products below/d\nw'

Hoặc như don crissti khuyến nghị:

ed -s file <<<$'/Products below/d\nw\nq'

2
edcâu trả lời luôn xứng đáng +1
evilsoup

1
biệt phái @evilsoup; mặc dù nếu bạn muốn đi theo cuốn sách, bạn cũng nên thêm tiểu ban quit:$'/Products below/d\nw\nq'
don_crissti

3

Bạn có thể sử dụng sedđể tìm kiếm mẫu để xóa từng dòng chứa mẫu này

sed -i '/Products below this line are out of stockNumber, month, year, reference, store/d' file

3

perliner

perl -ne 'print unless (m/Products below/') FILE

2

Đây là một ví dụ khác về việc sử dụng sed:

sed '/^Products below this line are out of stockNumber, month, year, reference, store$/d' originalDocument > newDocument
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.