ค้นหาเส้นที่ไม่เหมือนใคร


92

ฉันจะค้นหาบรรทัดที่ไม่ซ้ำกันและลบรายการที่ซ้ำกันทั้งหมดออกจากไฟล์ได้อย่างไร ไฟล์อินพุตของฉันคือ

1
1
2
3
5
5
7
7

ฉันต้องการให้ผลลัพธ์เป็น:

2
3

sort file | uniqจะไม่ทำงาน จะแสดงค่าทั้งหมด 1 ครั้ง


17
ต้องเรียงลำดับไฟล์ก่อน sort file | uniq -uจะส่งออกไปยังคอนโซลสำหรับคุณ
ma77c

ฉันคิดว่าเหตุผลที่sort file | uniqแสดงค่าทั้งหมด 1 ครั้งเป็นเพราะมันพิมพ์บรรทัดที่พบในครั้งแรกทันทีและสำหรับการเผชิญหน้าครั้งต่อ ๆ ไปมันก็ข้ามค่าเหล่านั้นไป
Reeshabh Ranjan

คำตอบ:


91

uniq มีตัวเลือกที่คุณต้องการ:

   -u, --unique
          only print unique lines
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3

33
ตรวจสอบให้แน่ใจว่าคุณเรียงลำดับว่ารายการในไฟล์หรือยังไม่ได้เรียงลำดับ จัดเรียง file.txt | uniq
user3885927

ดูคำตอบของฉันหากคุณไม่ต้องการเรียงลำดับก่อน stackoverflow.com/a/54803217/5441945
hychou

28

ใช้ดังนี้:

sort < filea | uniq > fileb

2
นี่ไม่ถูกต้องฉันคิดว่าคุณหมายถึง:uniq -u filea > fileb
Chris Seymour

1
ฉันคัดลอกข้อมูลของคุณและเรียกใช้และใช้งานได้: sort<filea.txt | uniq>fileb.txt. บางทีคุณอาจทิ้งส่วนขยายไว้ ฉันใช้ Mac OS X คุณต้องเปลี่ยนจากfilea.txtที่อื่นfileb.txt
kasavbere

ไม่จำเป็นต้องมีการเปลี่ยนเส้นทางโดยไม่เป็นsortและสิ่งที่จุดของท่อไปuniqเมื่อคุณก็สามารถทำsort -u file -o fileสิ่งที่คุณกำลังทำคือการเอาค่าที่ซ้ำกันเช่นคุณfilebมี1,2,3,5,7OP ต้องการเส้นที่เป็นเอกลักษณ์เฉพาะซึ่งเป็น2,3และจะทำได้โดยuniq -u fileไฟล์นามสกุลมีอะไร กับมันคำตอบของคุณผิด
Chris Seymour

13

คุณยังสามารถพิมพ์ค่าเฉพาะใน "ไฟล์" โดยใช้catคำสั่งโดยไปที่sortและuniq

cat file | sort | uniq -u


9

uniq -u ทำให้ฉันคลั่งไคล้เพราะมันไม่ได้ผล

ดังนั้นแทนที่จะเป็นเช่นนั้นหากคุณมี python (Linux distros และเซิร์ฟเวอร์ส่วนใหญ่มีอยู่แล้ว):

สมมติว่าคุณมีไฟล์ข้อมูลใน notUnique.txt

#Python
#Assuming file has data on different lines
#Otherwise fix split() accordingly.

uniqueData = []
fileData = open('notUnique.txt').read().split('\n')

for i in fileData:
  if i.strip()!='':
    uniqueData.append(i)

print uniqueData

###Another option (less keystrokes):
set(open('notUnique.txt').read().split('\n'))

โปรดทราบว่าเนื่องจากบรรทัดว่างชุดสุดท้ายอาจมีสตริง "" หรือเว้นวรรคเท่านั้น คุณสามารถลบออกได้ในภายหลัง หรือเพียงแค่หลีกเลี่ยงการคัดลอกจากเทอร์มินัล;)

#

แค่ FYI จากหน้า uniq Man:

"หมายเหตุ:" uniq "จะไม่ตรวจพบบรรทัดที่ซ้ำกันเว้นแต่จะอยู่ติดกันคุณอาจต้องการเรียงลำดับอินพุตก่อนหรือใช้" sort -u "โดยไม่มี" uniq "นอกจากนี้ให้เปรียบเทียบตามกฎที่ระบุโดย" LC_COLLATE ""

หนึ่งในวิธีที่ถูกต้องในการเรียกใช้: # sort nonUnique.txt | uniq

ตัวอย่างการรัน:

$ cat x
3
1
2
2
2
3
1
3

$ uniq x
3
1
2
3
1
3

$ uniq -u x
3
1
3
1
3

$ sort x | uniq
1
2
3

อาจมีการพิมพ์ช่องว่างดังนั้นเตรียมตัวให้พร้อม!


3
นี่คือการกินมากเกินไป
SmallChess

9

ในขณะที่sortใช้เวลา O (n log (n)) ฉันชอบใช้

awk '!seen[$0]++'

awk '!seen[$0]++'เป็นคำย่อของawk '!seen[$0]++ {print}'บรรทัดการพิมพ์ (= $ 0) ถ้าseen[$0]ไม่ใช่ศูนย์ ใช้พื้นที่มากขึ้น แต่ใช้เวลาเพียง O (n)




3

uniqควรจะทำได้ดีถ้าคุณจัดเรียงไฟล์ได้หากคุณไม่สามารถจัดเรียงไฟล์ได้ด้วยเหตุผลบางประการคุณสามารถใช้awk:

awk '{a[$0]++}END{for(i in a)if(a[i]<2)print i}'


3
sort -d "file name" | uniq -u

สิ่งนี้ใช้ได้ผลสำหรับฉันสำหรับสิ่งที่คล้ายกัน ใช้สิ่งนี้หากไม่มีการจัดเรียง คุณสามารถลบการจัดเรียงได้หากมีการจัดเรียง



0

นี่เป็นครั้งแรกที่ฉันลอง

skilla:~# uniq -u all.sorted  

76679787
76679787 
76794979
76794979 
76869286
76869286 
......

หลังจากทำ cat -e all. sort

skilla:~# cat -e all.sorted 
$
76679787$
76679787 $
76701427$
76701427$
76794979$
76794979 $
76869286$
76869286 $

ทุกบรรทัดที่สองมีช่องว่างต่อท้าย :( หลังจากลบช่องว่างต่อท้ายทั้งหมดแล้วมันใช้งานได้!

ขอขอบคุณ

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