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


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

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

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

Оффлайн RazrFalcon

  • Автор темы
  • O_o
  • Старожил
  • *
  • Сообщений: 3144
  • 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
  • Старожил
  • *
  • Сообщений: 3144
  • 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
  • Старожил
  • *
  • Сообщений: 3144
  • 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
  • Старожил
  • *
  • Сообщений: 3144
  • 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

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
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

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
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

  • Активист
  • *
  • Сообщений: 629
    • Просмотр профиля
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.087 секунд. Запросов: 26.