На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
Grih65kop
Сообщения: 145
Сообщение
Grih65kop » 22.04.2010 23:00
Есть два файла:
1.txt
Код: Выделить всё
1030-01-01 14.38.25.14 abc
3010-01-22 14.48.4.28 abc
4210-01-03 11.44.27.22 abc
1030-01-01 14.35.23.14 abc
3010-01-22 14.47.4.28 abc
4210-01-03 11.42.27.21 abc
1030-01-01 14.38.25.14 abc
3010-01-22 14.44.3.28 abc
4210-01-03 11.44.17.29 abc
2.txt
Код: Выделить всё
1030-01-01 14.28.61.11 abc
3010-01-22 14.48.4.78 abc
4210-01-03 11.44.23.22 abc
1030-01-01 14.35.23.44 abc
3010-01-22 14.47.4.28 abc
4210-01-03 11.42.57.51 abc
1030-01-01 14.38.15.14 abc
3010-01-22 14.44.2.28 abc
4210-01-03 11.44.15.29 abc
Меня интересует второй столбик, выдергиваю его и удоляю дубли следующим образом:
Код: Выделить всё
awk -F\ '{ print $2 }' 1.txt | sort | uniq
awk -F\ '{ print $2 }' 2.txt | sort | uniq
Вот дальше приходится сравнивать результаты глазами, что уже надоело если честно.
Чего я пытаюсь добиться:
Код: Выделить всё
1.txt 2.txt
11.42.27.21
11.42.57.51
11.44.15.29
11.44.17.29
11.44.23.22
14.44.3.28
14.47.4.28 14.47.4.28
....
т.е. вывод в два столбика, сортировка, так как раз сразу все одинаковые строки будут видны.
Заранее спасибо.
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows
Сообщение
allez » 22.04.2010 23:24
Может, вам стоит попробовать diff ?
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 22.04.2010 23:32
diff
vimdiff
kdiff3
Grih65kop
Сообщения: 145
Сообщение
Grih65kop » 22.04.2010 23:49
awk -F\ '{ print $2 }' 1.txt | sort | uniq >11.txt
awk -F\ '{ print $2 }' 2.txt | sort | uniq>22.txt
diff --si 11.txt 22.txt | sort
Код: Выделить всё
11.42.27.21 | 11.42.57.51
11.44.17.29 | 11.44.15.29
11.44.27.22 | 11.44.23.22
14.35.23.14 | 14.28.61.11
14.38.25.14 | 14.35.23.44
> 14.44.2.28
14.44.3.28 | 14.38.15.14
14.47.4.28 14.47.4.28
14.48.4.28 | 14.48.4.78
т.е. понятно, только строка 14.47.4.28 в обоих файлах. Меня смущает слишком много действий (т.е. три команды), возможно ли это сократить в одну?
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Сообщение
sash-kan » 22.04.2010 23:52
Shell
$ comm <(cut -d' ' -f 5 file1 | sort -n) <(cut -d' ' -f 5 file2 | sort -n)
11.42.27.21
11.42.57.51
11.44.15.29
11.44.17.29
11.44.23.22
11.44.27.22
14.28.61.11
14.35.23.14
14.35.23.44
14.38.15.14
14.38.25.14
14.38.25.14
14.44.2.28
14.44.3.28
14.47.4.28
14.48.4.28
14.48.4.78
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Сообщение
eddy » 23.04.2010 00:01
sash-kan , спасибо! А я про comm и не знал, писал сам аналог "comm -1" или "comm -3". Правда, моя программка в предварительной сортировке не нуждалась
RTFM
-------
KOI8-R - патриотичная кодировка
Grih65kop
Сообщения: 145
Сообщение
Grih65kop » 23.04.2010 00:20
Решил это дело следующим образом:
diff --si <(cut -f"" 3 1.txt | sort -n) <(cut -f"" 3 2.txt | sort -n)
Очень интересная конструкция, не встречал раньше такой, спасибо. Расскажите про нее подробней, а то делаю по примеру но не совсем понимаю.
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Сообщение
sash-kan » 23.04.2010 01:14
eddy писал(а): ↑ 23.04.2010 00:01
А я про comm и не знал
а вы почитайте таки info coreutils. глядишь, ещё что-нибудь полезное всплывёт.
Grih65kop писал(а): ↑ 23.04.2010 00:20
Расскажите про нее подробней
про подстановку stdin-а или stdout-а процесса в виде файлового дескриптора другому процессу?
$ man -P cat bash | less -p"Process Substitution"
не везде это можно применить. в частности, программы, пытающиеся открыть файл с доступом и на чтение, и на запись, конечно же, заругаются. их не удовлетворит ни <(), ни >().