ลบรายการที่ซ้ำกันออกจากไฟล์ CSV


13

ฉันมีไฟล์ [csv] ซึ่งมีการพิมพ์ซ้ำข้อมูลเช่นข้อมูลเดียวกันที่พิมพ์สองครั้ง ฉันได้ลองใช้uniq ของ sort โดยที่sort myfile.csv | uniq -uไม่มีการเปลี่ยนแปลงmyfile.csvและฉันได้ลองแล้วsudo sort myfile.csv | uniq -uแต่ก็ไม่แตกต่างกัน

ดังนั้นปัจจุบันไฟล์ csv ของฉันมีลักษณะเช่นนี้

a
a
a
b
b
c
c
c
c
c

ฉันต้องการที่จะดูเหมือน

a
b
c

sort -u myfile.csv> tmp.csv; mv -f tmp.csv myfile.csv
Archemar

ตามที่man sortคุณไม่สามารถจัดเรียง "ในสถานที่"
Archemar

นอกจากนี้คุณยังสามารถลองใช้งานเครื่องไม่ได้ คุณสามารถลองใช้เครื่องมือออนไลน์นี้แทนtextmechanic.com/text-tools/basic-text-tools/ ......
Aminah Nuraini

คำตอบ:


16

เหตุผลที่myfile.csvไม่ได้มีการเปลี่ยนแปลงเป็นเพราะ-uตัวเลือกสำหรับการuniqจะเพียงพิมพ์บรรทัดที่ไม่ซ้ำกัน ในไฟล์นี้ทุกบรรทัดจะซ้ำกันดังนั้นพวกเขาจะไม่ถูกพิมพ์ออกมา

อย่างไรก็ตามที่สำคัญกว่านั้นเอาต์พุตจะไม่ถูกบันทึกไว้ในmyfile.csvเพราะuniqจะพิมพ์ออกไปที่stdout(โดยค่าเริ่มต้นคอนโซลของคุณ)

คุณจะต้องทำสิ่งนี้:

$ sort -u myfile.csv -o myfile.csv

ตัวเลือกหมายถึง:

  • -u - เก็บเฉพาะบรรทัดที่ไม่ซ้ำกัน
  • -o - ส่งออกไปยังไฟล์นี้แทน stdout

คุณควรดูman sortข้อมูลเพิ่มเติม


3

ดังที่เบลมีแสดงให้เห็น คำตอบของเขาดีที่สุดสำหรับข้อมูลที่ไม่เรียงลำดับและง่ายต่อการจดจำและใช้งาน

อย่างไรก็ตามมันยังมีความผันผวนเช่นเดียวกันกับการเปลี่ยนแปลงลำดับของอินพุต หากคุณต้องการให้ข้อมูลดำเนินการในลำดับเดียวกัน แต่การลบข้อมูลที่ซ้ำกันในภายหลัง awk อาจดีกว่า

$ cat myfile.csv
c
a
c
b
b
a
c


$ awk '{if (!($0 in x)) {print $0; x[$0]=1} }' myfile.csv
c
a
b

เคสขอบแปลก ๆ แต่มันเกิดขึ้นเป็นครั้งคราว

นอกจากนี้หากข้อมูลของคุณถูกจัดเรียงแล้วเมื่อคุณโผล่มันคุณก็สามารถเรียกใช้ uniq ได้

$ cat myfile.csv 
a
a
a
b
b
c
c
c
c
c


$ uniq myfile.csv 
a
b
c

ข้อเสียของคำแนะนำของฉันคือคุณต้องใช้ไฟล์ชั่วคราวและคัดลอกไฟล์นั้นกลับมา


2

UNIQ -uพิมพ์เฉพาะสายที่ไม่ซ้ำกัน การป้อนข้อมูลของคุณไม่มีเส้นที่ไม่ซ้ำดังนั้นจึงuniq -uไม่ต้องพิมพ์อะไรเลย คุณต้องการเพียงsort:

sort -u myfile.csv

2

หากคุณต้องการรักษาลำดับของไฟล์ (ไม่เรียง) แต่ยังคงลบรายการที่ซ้ำกันคุณสามารถทำได้

awk '!v[$1]++' /tmp/file

ตัวอย่างเช่น

d
d
a
a
b
b
c
c
c
c
c

มันจะออก

d
a
b
c

คุณช่วยขยายไวยากรณ์ได้ไหม?
Sopalajo de Arrierez

วางสตริงในแฮช หากสตริงไม่มีอยู่ในแฮชให้พิมพ์
NinjaGaiden
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.