Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Поиск недостающих строк [BASH]  (Прочитано 1420 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн RazrFalcon

  • Автор темы
  • O_o
  • Старожил
  • *
  • Сообщений: 3129
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Поиск недостающих строк [BASH]
« : 30 Сентября 2011, 01:15:52 »
Есть два текстовых файла.
Нужно найти строки, которых нет во втором, но есть в первом. Без учета их положения в файле.
Пробовал diff и comm - не получается...

Пример:
1-й
string 1
string 2
string 3
string 4

2-й
string 2
string 4
string 1

Ответ:
string 3
« Последнее редактирование: 30 Сентября 2011, 01:18:13 от RazrFalcon »
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: https://help.ubuntu.ru/wiki/fixme

Оффлайн yorik1984

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 1592
  • Кто не хочет, ищет причины
    • Просмотр профиля
Re: Поиск недостающих строк [BASH]
« Ответ #1 : 30 Сентября 2011, 01:21:47 »
скриппт надо написать?

Оффлайн RazrFalcon

  • Автор темы
  • O_o
  • Старожил
  • *
  • Сообщений: 3129
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Re: Поиск недостающих строк [BASH]
« Ответ #2 : 30 Сентября 2011, 11:02:55 »
Ну наверное.  ???
Решение на баше нужно. Желательно по проще и логичнее.

PS: циклами пройтись и я могу, я ищу более красивое решение.
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: https://help.ubuntu.ru/wiki/fixme

andrey_p

  • Гость
Re: Поиск недостающих строк [BASH]
« Ответ #3 : 30 Сентября 2011, 11:52:09 »
awk '
FNR == NR { a[$0]++ }
FNR != NR && !($0 in a)
'  FILE2 FILE1
Второй файл указывай первым в командной строке.

Пользователь решил продолжить мысль 30 Сентября 2011, 11:55:43:
Что-то подобное можно и в bash4 - прочитать строки из второго файла в ассоциативный массив, потом читать из первого, и если нет в массиве, выводить на печать. Но будет некрасиво и разные заковырки с read могут возникать.
« Последнее редактирование: 30 Сентября 2011, 11:55:43 от andrey_p »

Оффлайн RazrFalcon

  • Автор темы
  • O_o
  • Старожил
  • *
  • Сообщений: 3129
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Re: Поиск недостающих строк [BASH]
« Ответ #4 : 30 Сентября 2011, 11:56:30 »
А расшифровку можно?
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: https://help.ubuntu.ru/wiki/fixme

andrey_p

  • Гость
Re: Поиск недостающих строк [BASH]
« Ответ #5 : 30 Сентября 2011, 12:33:15 »
Программы на awk состоят из последовательности правил. Каждое правило состоит из двух частей - условие и, в фигурных скобках, действие. Файлы считываются из стандартного ввода или аргументов командной строки построчно и над ними (считанными строками) по очереди выполняются указанные правила.

1-ое правило: FNR (File Number Record == NR (Number Record) совпадают только для первого файла, во втором (и последующих) различаются. Когда считываем первый файл, то запоминаем строки ($0) в ассоциативном массиве "а" - тут этот массив выступает в роли множества.

2-ое правило: Когда считываем второй файл, то проверяем, присутствует ли строка в массиве "a", если нет, то выполняется действие по умолчанию - печать строки, поэтому здесь пропущена часть в фигурных скобках.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Поиск недостающих строк [BASH]
« Ответ #6 : 30 Сентября 2011, 16:27:25 »
Пробовал diff и comm - не получается...
Для Вашего случая перед diff надо делать sort. Тогда должно заработать.

Оффлайн RazrFalcon

  • Автор темы
  • O_o
  • Старожил
  • *
  • Сообщений: 3129
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Re: Поиск недостающих строк [BASH]
« Ответ #7 : 30 Сентября 2011, 18:40:13 »
Для Вашего случая перед diff надо делать sort. Тогда должно заработать.
Файлы большие, с разными строками - не помогало.

andrey_p, спасибо, логику понял, но надо еще переварить до конца.
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: https://help.ubuntu.ru/wiki/fixme

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: Поиск недостающих строк [BASH]
« Ответ #8 : 03 Октября 2011, 00:56:20 »
Короче, я не спец по башу, но можно так:
sort file1 file2 > file3 # из двух файлов получаем один отсортированный
uniq -u file3 output   # output - то, что нам нужно
Нужно только совместить их, чтобы была одна строка, желательно без промежуточного файла file3.
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: Поиск недостающих строк [BASH]
« Ответ #9 : 03 Октября 2011, 01:35:51 »
Ну вот, пока я надыбал свое решение, arcfi опять тут как тут  :)
sort file1 file2 | uniq -u > file3
Linux is only free if your time has no value (c) Jamie Zawinski

andrey_p

  • Гость
Re: Поиск недостающих строк [BASH]
« Ответ #10 : 03 Октября 2011, 07:58:18 »
Это не то, о чем было спрошено в ОП. Для указанных примеров работает, но если в 2-м файле будет, к примеру, String5, то она тоже будет выведена, а не должна быть, согласно условиям.

И да, еще, между прочим. sort имеет ключ -u, так что дополнительно пропускать через uniq никакого смысла нет.
« Последнее редактирование: 03 Октября 2011, 08:00:26 от andrey_p »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Поиск недостающих строк [BASH]
« Ответ #11 : 03 Октября 2011, 10:17:53 »
Проще написать на питоне и не заморачиваться, мсм.
al@al-desktop:~/Programming/python/Diff$ ls
diff.py  file1  file2
al@al-desktop:~/Programming/python/Diff$ cat ./diff.py
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
import os, sys
a=open(sys.argv[1],'rb').readlines()
b=open(sys.argv[2],'rb').readlines()
for a1 in a:
res=0
for b1 in b:
if a1==b1:
res=1
break
if res==0:
print a1

al@al-desktop:~/Programming/python/Diff$ cat ./file1
string 1
string 2
string 3
string 4
al@al-desktop:~/Programming/python/Diff$ cat ./file2
string 2
string 4
string 1
al@al-desktop:~/Programming/python/Diff$ ./diff.py ./file1 ./file2
string 3

al@al-desktop:~/Programming/python/Diff$
« Последнее редактирование: 03 Октября 2011, 10:19:44 от alexander.pronin »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Поиск недостающих строк [BASH]
« Ответ #13 : 03 Октября 2011, 16:37:04 »

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: Поиск недостающих строк [BASH]
« Ответ #14 : 03 Октября 2011, 17:02:07 »
Почему неожиданно? Все гениальное - просто.
Тут, в принципе, получается так:
diff file1 file2
Только посредством < и скобок подставляется предварительно отсортированные файлы. Надо будет запомнить.
Linux is only free if your time has no value (c) Jamie Zawinski

 

Страница сгенерирована за 0.029 секунд. Запросов: 25.