รวมสองรายการในขณะที่ลบรายการที่ซ้ำกัน


18

ฉันมีระบบลินุกซ์ในตัวโดยใช้ Busybox (OpenWRT) - ดังนั้นคำสั่งจะถูก จำกัด ฉันมีสองไฟล์ที่มีลักษณะดังนี้:

ไฟล์แรก

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

ไฟล์ที่สอง

mmmmmm
nnnnnn
yyyyyy
zzzzzz

ฉันต้องการรวม 2 รายการเหล่านี้เป็น 1 ไฟล์และลบรายการที่ซ้ำกัน ผมไม่ได้มีความแตกต่าง (พื้นที่ จำกัด ) เราจึงได้รับการใช้งานที่ดีawk, sedและgrep(หรือเครื่องมืออื่น ๆ ที่อาจจะรวมอยู่ในอินสแตนซ์ Busybox มาตรฐาน) ไปที่ไฟล์ผสานเช่น:

command1 > mylist.merge 
command2 mylist.merge > originallist

ไม่เป็นไร มันไม่จำเป็นต้องเป็นคำสั่งบรรทัดเดียว

ฟังก์ชั่นที่กำหนดไว้ในปัจจุบันในกรณีของ Busybox ที่ฉันใช้ (ค่าเริ่มต้น OpenWRT): [, [, [, arping, ash, awk, basename, brctl, bunzip2, bzcat, แมว, chgrp, chmod, chroot, chroot, clear, cmp, cp, crond, crontab, ตัด, วันที่, dd, df, dirname, dmesg, du, echo, egrep, env, expr, เท็จ, fgrep, หา, ฟรี, fsync, grez, gunzip, gzip, หยุด, หัว hexdump hostid, hwclock, id, ifconfig, init, insmod, ฆ่า, killall, klogd, หักล้าง, ln, ล็อก, คนตัดไม้, logread, ls, lsmod, md5sum, mkdir, mkfifo, mknf, mknod, mkt, เมา netstat, ดี, nslookup, ntpd, passwd, pgrep, pidof, ping, ping6, pivot_root, pkill, poweroff, printf, ps, pwd, รีบูต, รีเซ็ต, rm, rmdir, rmmod, เส้นทาง, sed, seq sh, sleep เรียงลำดับ, start-stop-daemon, สตริง, switch_root, sync, sysctl, syslogd, tail, tar, tee, telnet, telnetd, ทดสอบ,เวลา, ด้านบน, สัมผัส, tr, traceroute, จริง, udhcpc, umount, uname, uniq, uptime, vconfig, vi, สุนัขเฝ้าบ้าน, wc, wget, ซึ่ง xargs, ใช่, zcat

คำตอบ:


28

ฉันคิด

sort file1 file2 | uniq
aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn
yyyyyy
zzzzzz

จะทำในสิ่งที่คุณต้องการ

เอกสารเพิ่มเติม: เรียงลำดับuniq


8
busybox -uเรียงสนับสนุนธงที่ไม่ซ้ำกัน
Thor

@Thor: oooh ไชโยนั่นไม่ใช่สวิตช์ที่ฉันคุ้นเคย

10

ในหนึ่งคำสั่งโดยไม่มีไพพ์ใด ๆ :

sort -u FILE1 FILE2

ค้นหา

ไม่แสดงบรรทัดที่ซ้ำกัน

-> http://www.busybox.net/downloads/BusyBox.html


อันไหนดีกว่าสำหรับไฟล์ที่มีขนาดใหญ่มาก? sort file1 file2 file3 file4 | uniqหรือsort -u file1 file2 file3 file4
0x90

4

ทางออกอื่น:

awk '!a[$0]++' file_1 file_2

ฉันเห็นว่ามันสร้างความแตกต่างที่อาร์กิวเมนต์มาก่อน ทางออกที่ดีเป็นอย่างอื่นขอบคุณ
dezza

2

ในการจัดเรียงตามคอลัมน์หลักให้ใช้ดังต่อไปนี้:

awk '!duplicate[$1,$2,$3]++' file_1 file_2

ที่นี่ให้พิจารณาคอลัมน์แรกที่สองและสามเป็นคีย์หลักของคุณ


1

ไฟล์ในคำถามของคุณจะถูกจัดเรียง
หากไฟล์ต้นฉบับถูกเรียงลำดับคุณสามารถ uniq และผสานในขั้นตอนเดียว:

sort -um file1 file2 > mylist.merge

สำหรับการเรียงลำดับตัวเลข (ไม่ใช่ตัวอักษรและตัวเลข) ให้ใช้:

sort -num file1 file2 > mylist.merge

ที่อาจไม่ต้องทำในสถานที่ (เปลี่ยนเส้นทางไปยังแฟ้มแหล่งที่มาอย่างใดอย่างหนึ่ง)

หากไฟล์ไม่เรียงลำดับให้เรียงลำดับ (เรียงลำดับนี้สามารถทำได้โดยใช้ตัวเลือกการเรียงลำดับ-oอย่างไรก็ตามไฟล์ทั้งหมดจะต้องโหลดเข้าสู่หน่วยความจำ):

sort -uo file1 file1
sort -uo file2 file2
sort -um file1 file2 > mylist.merge
mv mylist.merge originallist

นั่นจะเร็วกว่า "หนึ่งบรรทัดคำสั่ง" ที่ง่ายกว่าในการจัดเรียงทั้งหมด:

cat file1 file2 | sort -u >mylist.merge

อย่างไรก็ตามบรรทัดนี้อาจมีประโยชน์สำหรับไฟล์ขนาดเล็ก

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