Как знать, является ли текстовый файл подмножеством другого

Можно использовать kpartx для этого. Вот способ создать полный образ диска.

# create empty image
dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100

# partition the image file with fdisk/gdisk or any other tool
gdisk myvm.img

# make the partitions in the image file available as individual devices
kpartx -a myvm.img

# work with the partitions
./someprogram /dev/mapper/loop0p1

# close the partitions
kpartx -d myvm.img
12
13.07.2019, 13:19
3 ответа

Если то содержание файла называют file1, file2 и file3 в порядке появления затем можно сделать это со следующей остротой:

 # python -c "x=open('file1').read(); y=open('file2').read(); print x in y or y in x"
 True
 # python -c "x=open('file2').read(); y=open('file1').read(); print x in y or y in x"
 True
 # python -c "x=open('file1').read(); y=open('file3').read(); print x in y or y in x"
 False
11
27.01.2020, 19:55
  • 1
    Спасибо за Ваш ответ.. +1.. Я не знаю, принимают ли мой ответ, потому что Ваш не конкретный Linux Unix, и мой ответ немного быстрее, насколько я протестировал его.. что Вы думаете? –  gc5 12.02.2014, 15:12
  • 2
    Вы приветствуете, существуют, конечно, другие решения с большим количеством Unix определенные инструменты. Но это кажется хорошим использованием Python in оператор. –  Timo 12.02.2014, 15:21
  • 3
    Существует обертка командной строки Python для создания этого большим количеством Unix как с передачей по каналу встроенного, названного pyp: code.google.com/p/pyp я думаю, что это тривиально для создания этого решения большим количеством Unix как один инструмент лайнера. –  IBr 14.11.2014, 11:15

Я нашел решение благодаря этому вопросу

В основном я тестирую два файла a.txt и b.txt с этим сценарием:

#!/bin/bash

first_cmp=$(diff --unchanged-line-format= --old-line-format= --new-line-format='%L' "$1" "$2" | wc -l)
second_cmp=$(diff --unchanged-line-format= --old-line-format= --new-line-format='%L' "$2" "$1" | wc -l)

if [ "$first_cmp" -eq "0" -o "$second_cmp" -eq "0" ]
then
    echo "Subset"
    exit 0
else
    echo "Not subset"
    exit 1
fi

Если Вы - подмножество другого возврат сценария 0 для True иначе 1.

2
27.01.2020, 19:55
  • 1
    Что делает %L? Этот сценарий, кажется, не работает, и я пытаюсь отладить его... –  Alex 24.05.2017, 19:18
  • 2
    я на самом деле не помню значение %L, это было три года назад. От man diff (текущая версия) %L означает "содержание строки". –  gc5 24.05.2017, 21:56
  • 3
    %L печатает содержание "новой" строки. IOW, ничего не печатайте для неизменных строк или старых строк, но печатайте содержание строки для новых строк. –  PLG 26.09.2017, 14:44
  • 4
    Этот сценарий работает на меня из поля! –  PLG 26.09.2017, 20:56

Если F1 представляет собой подмножество F2, то F1 - F2 - это пустой набор. Строительство на этом мы можем написать функцию IS_Subset и функцию, полученную из нее. В соответствии с установлена ​​разница между 2 текстовыми файлами



sort_files () {
  f1_sorted="$1.sorted"
  f2_sorted="$2.sorted"

  if [ ! -f $f1_sorted ]; then
    cat $1 | sort | uniq > $f1_sorted
  fi

  if [ ! -f $f2_sorted ]; then
    cat $2 | sort | uniq > $f2_sorted
  fi
}

remove_sorted_files () {
  f1_sorted="$1.sorted"
  f2_sorted="$2.sorted"
  rm -f $f1_sorted
  rm -f $f2_sorted
}

set_union () {
  sort_files $1 $2
  cat "$1.sorted" "$2.sorted" | sort | uniq
  remove_sorted_files $1 $2
}

set_diff () {
  sort_files $1 $2
  cat "$1.sorted" "$2.sorted" "$2.sorted" | sort | uniq -u
  remove_sorted_files $1 $2
}

rset_diff () {
  sort_files $1 $2
  cat "$1.sorted" "$2.sorted" "$1.sorted" | sort | uniq -u
  remove_sorted_files $1 $2
}

is_subset () {
  sort_files $1 $2
  output=$(set_diff $1 $2)
  remove_sorted_files $1 $2

  if [ -z $output ]; then
    return 0
  else
    return 1
  fi

}

2
27.01.2020, 19:55

Теги

Похожие вопросы