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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

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

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

  • Активист
  • *
  • Сообщений: 641
    • Просмотр профиля
Re: Поиск недостающих строк [BASH]
« Ответ #8 : 03 Октября 2011, 00:56:20 »
Короче, я не спец по башу, но можно так:
sort file1 file2 > file3 # из двух файлов получаем один отсортированный
uniq -u file3 output   # output - то, что нам нужно
Нужно только совместить их, чтобы была одна строка, желательно без промежуточного файла file3.
Нейросети тебя не заменят. Тебя заменит человек, который умеет ими пользоваться.

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 641
    • Просмотр профиля
Re: Поиск недостающих строк [BASH]
« Ответ #9 : 03 Октября 2011, 01:35:51 »
Ну вот, пока я надыбал свое решение, arcfi опять тут как тут  :)
sort file1 file2 | uniq -u > file3
Нейросети тебя не заменят. Тебя заменит человек, который умеет ими пользоваться.

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

  • Активист
  • *
  • Сообщений: 641
    • Просмотр профиля
Re: Поиск недостающих строк [BASH]
« Ответ #14 : 03 Октября 2011, 17:02:07 »
Почему неожиданно? Все гениальное - просто.
Тут, в принципе, получается так:
diff file1 file2
Только посредством < и скобок подставляется предварительно отсортированные файлы. Надо будет запомнить.
Нейросети тебя не заменят. Тебя заменит человек, который умеет ими пользоваться.

 

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