重複を削除しながら2つのリストをマージする


18

Busybox(OpenWRT)を使用した組み込みLinuxシステムがあるため、コマンドが制限されています。次のような2つのファイルがあります。

最初のファイル

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

2番目のファイル

mmmmmm
nnnnnn
yyyyyy
zzzzzz

これら2つのリストを1つのファイルにマージし、重複を削除する必要があります。 私たちは偉大なを使用して取得して(スペースが限られている)の差分を持っていないawksedgrep(または標準Busyboxのインスタンスに含まれている場合があります他のツール)。次のようなマージファイルに移動します。

command1 > mylist.merge 
command2 mylist.merge > originallist

大丈夫です。単一行のコマンドである必要はありません。

私が使用しているBusyboxのインスタンスで現在定義されている関数(デフォルトOpenWRT):[、[[、arping、ash、awk、basename、brctl、bunzip2、bzcat、cat、chgrp、chmod、chown、chroot、clear、cmp、 cp、crond、crontab、cut、date、dd、df、dirname、dmesg、du、echo、egrep、env、expr、false、fgrep、find、free、fsync、grep、gunzip、gzip、halt、head、hexdump、 hostid、hwclock、id、ifconfig、init、insmod、kill、killall、klogd、less、ln、lock、logger、logread、ls、lsmod、md5sum、mkdir、mkfifo、mknod、mktemp、mount、mv、nc、netmsg、 netstat、nice、nslookup、ntpd、passwd、pgrep、pidof、ping、ping6、pivot_root、pkill、poweroff、printf、ps、pwd、reboot、reset、rm、rmdir、rmmod、route、sed、seq、sh、sleep、 sort、start-stop-daemon、strings、switch_root、sync、sysctl、syslogd、tail、tar、tee、telnet、telnetd、test、time、top、touch、tr、traceroute、true、udhcpc、umount、uname、uniq、uptime、vconfig、vi、watchdog、wc、wget、which、xargs、yes、zcat

回答:


28

おもう

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

あなたがしたいことをします。

追加のドキュメント:uniq sort


8
busybox sortはuniqueフラグをサポートしてい-uます。
トール

@Thor:おおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおあおおおおお


4

別の解決策:

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

私はそれがどちらの議論が最初に来たの違いを作ったことを見ました。そうでなければ素晴らしい解決策、ありがとう。
デザ

2

いくつかのキー列に従ってソートするには、次を使用します。

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

ここでは、1列目、2列目、3列目を主キーと見なします。


1

質問のファイルが並べ替えられます。
ソースファイルが実際にソートされている場合、1つの手順でuniqおよびマージできます。

sort -um file1 file2 > mylist.merge

数値の並べ替え(英数字ではない)の場合:

sort -num file1 file2 > mylist.merge

それはインプレースで実行できませんでした(1つのソースファイルにリダイレクトされます)。

ファイルが並べ替えられていない場合は、並べ替えます(並べ替えオプションを使用して、この並べ替えを実行できます-o。ただし、ファイル全体をメモリに読み込む必要があります)。

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

これは、すべてをソートするための単純な「1つのコマンドライン」よりも高速です。

cat file1 file2 | sort -u >mylist.merge

ただし、この行は小さなファイルには役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.