จะพิมพ์เฉพาะค่าซ้ำซ้อนจากไฟล์ข้อความได้อย่างไร


69

สมมติว่ามีคอลัมน์ของค่าตัวเลขดังนี้:

file1:

1 
2
3
3
3
4
4
4
5
6

ฉันต้องการผลลัพธ์:

3  
4

นั่นคือมีเพียงบรรทัดที่ซ้ำกัน มีเครื่องมือบรรทัดคำสั่งเพื่อค้นหาสิ่งนี้ใน Linux? (หมายเหตุ: ค่าจะถูกจัดเรียงเป็นตัวเลข)


3
man uniqดู
jasonwryan

คำถามที่เกี่ยวข้องและยากขึ้น: ลบบรรทัดที่ซ้ำกันเป็นคู่
ไวด์การ์ด

คำตอบ:


118

คุณสามารถใช้uniq(1)สิ่งนี้:

uniq -d file.txt

จะพิมพ์สำเนาที่ซ้ำกันเท่านั้น ไฟล์อินพุตจะต้องมีการเรียงลำดับเพื่อให้รายการที่ซ้ำกันทั้งหมดเรียงลำดับกัน (ซึ่งดูเหมือนจะเป็น) ดังนั้นให้เรียกใช้ผ่านการเรียงลำดับก่อนหากไม่ใช่


1
จะทำอย่างไรถ้าฉันต้องการให้พิมพ์ triplicates เท่านั้น?
MiNdFrEaK

8
@MiNdFrEaK sort | uniq -c | grep '^\s*3\s' | sed 's/^\s*[0-9]*\s*//'สำหรับ triplicates; แทนที่ "3" ด้วย N สำหรับ N-plicates
full.stack.ex

@MiNdFrEaK sort | uniq -c | sed -n 's/^[[:blank:]]*3[[:blank:]]\{1,\}//p'สำหรับ triplicates

@camh คุณสามารถทำเช่นนี้กับไฟล์ csv ได้หรือไม่? เฉพาะค่าของคอลัมน์ใดคอลัมน์หนึ่งเท่านั้น
NumenorForLife

1
sort file.txt | uniq -d
ron

1

การใช้uniqและawk:

cat File1  | uniq -c | awk '$1 > 1 { print $2 }'

6
ใช้งานได้ แต่ฉันไม่เห็นว่าทำไมคุณท่อส่งออกของcat?
แบร์นฮาร์ด

1
ไม่ใช่ทุกคนที่รู้ว่าคุณสามารถทำได้uniq -c File1และคล้ายกับเครื่องมืออื่น ๆ อีกมากมาย นั่นอาจเป็นสิ่งที่เกิดขึ้นที่นี่
Matthias

1

ดำเนินการสิ่งนี้: perl -ne 'print if $a{$_}++' filename.txt


มันให้3\n3\n4\n\4nสำหรับอินพุตไฟล์ 1 ซึ่งผิดอย่างเห็นได้ชัด
yaegashi

perl snip ที่ฉันพบว่าตัวเอง revisiting ให้จำนวน incidences ของแต่ละบรรทัดเพื่อให้สามารถ piped เรียงลำดับและกรองตามต้องการ: perl -ne '$ a {$ _} ++; END {ในขณะที่ (($ k, $ v) = แต่ละ% a) ชื่อไฟล์ 'printd "% d \ t% s", $ v, $ k}}}
Theophrastus

มีวิธีการทำเช่นนั้นในคอลัมน์เฉพาะคั่นด้วยคั่นฟิลด์ที่กำหนด?
Geremia

ตามที่ระบุโดย yaegashi จำเป็นต้องมีการแก้ไขเล็กน้อยเพื่อให้เป็นไปตามข้อกำหนด: perl -ne 'print ถ้า 1 == $ a {$ _} ++' filename.txt ในบรรดาคำตอบทั้งหมดฉันชอบเพราะคำตอบอื่น ๆ ต้องการประมวลผลข้อมูลทั้งหมดล่วงหน้าด้วยการเรียงลำดับเต็ม คำตอบนี้จะเริ่มผลลัพธ์ผลลัพธ์อย่างรวดเร็วและมีประสิทธิภาพยิ่งขึ้น
BOC

0

uniq ต้องมีรายการสั่งซื้อของคุณเรียงลำดับค่าเริ่มต้นเป็นตัวอักษร

sort | uniq -d path/to/your/filename

หรือ

cat fileName | sort | uniq -d path/to/your/filename

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