web-dev-qa-db-ja.com

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

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

最初のファイル

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

2番目のファイル

mmmmmm
nnnnnn
yyyyyy
zzzzzz

これら2つのリストを1つのファイルにマージし、重複を削除する必要があります。 私はdiff(スペースが限られている)を持っていないので、すばらしいawksed、およびgrep(または標準に含まれている可能性がある他のツール)を使用できます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、that、xargs、yes、zcat

20
slthomason

おもう

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

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

追加ドキュメント: niqsort

30
user591

パイプなしの1つのコマンドで:

sort -u FILE1 FILE2

探す

重複する行を抑制

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

11
Gilles Quenot

別の解決策:

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

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

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

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

2
Prem Joshi

質問のファイルがソートされます。
ソースファイルが実際にソートされている場合、1つの手順でuniq化してマージできます。

sort -um file1 file2 > mylist.merge

数値ソート(英数字ではない)の場合は、以下を使用します。

sort -num file1 file2 > mylist.merge

notインプレースで実行できます(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

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

1
Isaac