ฉันจะค้นหาบรรทัดที่ไม่ซ้ำกันและลบรายการที่ซ้ำกันทั้งหมดออกจากไฟล์ได้อย่างไร ไฟล์อินพุตของฉันคือ
1
1
2
3
5
5
7
7
ฉันต้องการให้ผลลัพธ์เป็น:
2
3
sort file | uniq
จะไม่ทำงาน จะแสดงค่าทั้งหมด 1 ครั้ง
ฉันจะค้นหาบรรทัดที่ไม่ซ้ำกันและลบรายการที่ซ้ำกันทั้งหมดออกจากไฟล์ได้อย่างไร ไฟล์อินพุตของฉันคือ
1
1
2
3
5
5
7
7
ฉันต้องการให้ผลลัพธ์เป็น:
2
3
sort file | uniq
จะไม่ทำงาน จะแสดงค่าทั้งหมด 1 ครั้ง
sort file | uniq
แสดงค่าทั้งหมด 1 ครั้งเป็นเพราะมันพิมพ์บรรทัดที่พบในครั้งแรกทันทีและสำหรับการเผชิญหน้าครั้งต่อ ๆ ไปมันก็ข้ามค่าเหล่านั้นไป
คำตอบ:
uniq
มีตัวเลือกที่คุณต้องการ:
-u, --unique
only print unique lines
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3
ใช้ดังนี้:
sort < filea | uniq > fileb
uniq -u filea > fileb
sort<filea.txt | uniq>fileb.txt
. บางทีคุณอาจทิ้งส่วนขยายไว้ ฉันใช้ Mac OS X คุณต้องเปลี่ยนจากfilea.txt
ที่อื่นfileb.txt
sort
และสิ่งที่จุดของท่อไปuniq
เมื่อคุณก็สามารถทำsort -u file -o file
สิ่งที่คุณกำลังทำคือการเอาค่าที่ซ้ำกันเช่นคุณfileb
มี1,2,3,5,7
OP ต้องการเส้นที่เป็นเอกลักษณ์เฉพาะซึ่งเป็น2,3
และจะทำได้โดยuniq -u file
ไฟล์นามสกุลมีอะไร กับมันคำตอบของคุณผิด
คุณยังสามารถพิมพ์ค่าเฉพาะใน "ไฟล์" โดยใช้cat
คำสั่งโดยไปที่sort
และuniq
cat file | sort | uniq -u
uniq -u ทำให้ฉันคลั่งไคล้เพราะมันไม่ได้ผล
ดังนั้นแทนที่จะเป็นเช่นนั้นหากคุณมี python (Linux distros และเซิร์ฟเวอร์ส่วนใหญ่มีอยู่แล้ว):
#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
ในขณะที่sort
ใช้เวลา O (n log (n)) ฉันชอบใช้
awk '!seen[$0]++'
awk '!seen[$0]++'
เป็นคำย่อของawk '!seen[$0]++ {print}'
บรรทัดการพิมพ์ (= $ 0) ถ้าseen[$0]
ไม่ใช่ศูนย์ ใช้พื้นที่มากขึ้น แต่ใช้เวลาเพียง O (n)
คุณสามารถใช้ได้:
sort data.txt| uniq -u
จัดเรียงข้อมูลและกรองตามค่าที่ไม่ซ้ำกัน
uniq -u < file
จะทำงาน
uniq
ควรจะทำได้ดีถ้าคุณจัดเรียงไฟล์ได้หากคุณไม่สามารถจัดเรียงไฟล์ได้ด้วยเหตุผลบางประการคุณสามารถใช้awk
:
awk '{a[$0]++}END{for(i in a)if(a[i]<2)print i}'
sort -d "file name" | uniq -u
สิ่งนี้ใช้ได้ผลสำหรับฉันสำหรับสิ่งที่คล้ายกัน ใช้สิ่งนี้หากไม่มีการจัดเรียง คุณสามารถลบการจัดเรียงได้หากมีการจัดเรียง
หาง่ายกว่านี้
sort -u input_filename > output_filename
-u
ย่อมาจากเอกลักษณ์
นี่เป็นครั้งแรกที่ฉันลอง
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 $
ทุกบรรทัดที่สองมีช่องว่างต่อท้าย :( หลังจากลบช่องว่างต่อท้ายทั้งหมดแล้วมันใช้งานได้!
ขอขอบคุณ
sort file | uniq -u
จะส่งออกไปยังคอนโซลสำหรับคุณ