сравнить две строки и вывести несопоставимые слова из двух файлов

У меня есть два файла. Допустим, файл1 и файл2

файл1 содержит « разделенный пробелами
file2 имеет " eipasoc-47367a3f eipassoc-10bbfb6 " каждый из них разделен пробелом

Я хотел напечатать " eipassoc -03cd9117d7188d2 eipasoc-bbbddc3 "в файле 3 . поскольку все, что я пытаюсь сделать, это не соответствующие слова из файла1.

Я пытался использовать «awk», «for loop», «while loop», но не смог найти решение. Любая идея о том, как минус и получить только непревзойденные.

Спасибо всем.

0
задан 13 July 2019 в 03:45

4 ответа

Я использовал комбинацию, чтобы заставить это делать то, что Вы хотите:

Генерируйте массивы с:

l1=$(cut -d" " -f 1- src1.txt)
l2=$(cut -d" " -f 1- src2.txt)

Используйте команду как это для сравнения обоих массивов:

l1=$(cut -d" " -f 1- src1.txt) && l2=$(cut -d" " -f 1- src2.txt) && echo "${l1[@]}" "${l2[@]}" | tr ' ' '\n' | sort | uniq -u | xargs -L 2 > result.txt

Результат:

a c

Информация:

  • echo "${l1[@]}" "${l2[@]}" | tr ' ' '\n': переведите вывод команды эха и заменяющий каждое пространство новой строкой

  • | sort | uniq -u: отсортируйте вывод и найдите уникальные значения

  • | xargs -L 2 > result.txt: передайте результат последней команды в файл результата

  • l1=$(cut -d" " -f 1- src1.txt) и l2=$(cut -d" " -f 1- src2.txt): Генерируйте массивы

Демонстрационный тест:

george@george-Inspiron-5570:/tmp$ echo "eipassoc-03cd9117d7188d2 eipasoc-47367a3f eipasoc-bbbddc3 eipassoc-10bbfb6" > f1.txt
george@george-Inspiron-5570:/tmp$ echo "eipasoc-47367a3f eipassoc-10bbfb6" > f2.txt
george@george-Inspiron-5570:/tmp$ l1=$(cut -d" " -f 1- f1.txt) && l2=$(cut -d" " -f 1- f2.txt) && echo "${l1[@]}" "${l2[@]}" | tr ' ' '\n' | sort | uniq -u | xargs -L 2 > result.txt
george@george-Inspiron-5570:/tmp$ cat result.txt 
eipasoc-bbbddc3 eipassoc-03cd9117d7188d2
george@george-Inspiron-5570:/tmp$ 
0
ответ дан 24 October 2019 в 00:01

Сначала помните, что, учитывая любые два списка, существует 3 типа различия, которое мы можем вычислить:

  1. элементы, которые находятся в Списке 1, но не находятся в Списке 2
  2. элементы, которые находятся в Списке 2, но не находятся в Списке 1
  3. элементы, которые находятся в одном списке, но не обоих (симметричное различие)

Стандартный инструмент Unix для сравнения списков (файлы) линию за линией comm. Это обычно выводы 3 столбца - от man comm:

   With  no  options,  produce  three-column  output.  Column one contains
   lines unique to FILE1, column two contains lines unique to  FILE2,  and
   column three contains lines common to both files.

соответствие первому, второму, и дополнению множества третьего типа различия. Это также требует, чтобы его исходные данные были отсортированы.

$ comm <(tr ' ' '\n' < file1 | sort) <(tr ' ' '\n' < file2 | sort)
a
                b
c
                d

(существует пустой средний столбец здесь, с тех пор для Ваших исходных данных в качестве примера нет никаких различий второго типа).

При предположении, что то, что Вы хотите, является первым типом различия (элементы, которые находятся в Списке 1, но не находятся в Списке 2) мы можем сказать comm подавить другие столбцы и затем вставить результат назад в разделенный пробелами список:

$ comm -23 <(tr ' ' '\n' < file1 | sort) <(tr ' ' '\n' < file2 | sort) | paste -sd ' '
a c

Если Вам не нравится этот подход, то жемчуг имеет Список:: Сравните модуль, который Вы могли использовать:

$ cat file1 file2 | perl -MList::Compare -alne '
    push @{ $a[$.] }, @F 
    }{ 
    $lc = List::Compare->new($a[1], $a[2]); 
    print join " ", $lc->get_Lonly()
  '
  a c

Другие языки (Python, рубин и т.д.), вероятно, имеют эквивалентную функциональность.

0
ответ дан 24 October 2019 в 00:01

Кажется, что у Вас есть два файла с огромной строкой каждый, который содержит (располагают разделенные маркеры с интервалами). Различный инструмент хорош для соответствия строки. Для объектов в строке необходимо будет быть немного более творческими.

Например,

:~$ cat file1
a b c d

:~$ cat file2
b d

:~$ cat file1 | sed 's/ /\n/g' |grep -vf <(cat file2|sed 's/ /\n/g') | tr '\n' ' '; echo

a c 

мы можем использовать другой ориентированный на строку инструмент для исключения строк из входного потока при помощи списка строк, обеспеченных как временный файл.

 sed 's/ /\n/g' 

преобразовывает пробелы в новые строки

 grep -v 
  • исключает условие фильтра из входного потока

    grep-f

  • использует список условий/строк из обеспеченного файла

    <( ... )

создайте дескриптор файла из вывода подпроцесса

 tr '\n' ' '

преобразовывает новые строки назад в пробелы. Однако не будет никакой строки в конце, таким образом, мы добавим запаздывающее эхо.

То же самое может быть достигнуто с помощью [g] AWK, поскольку это имеет встроенные карты. Необходимо будет установить разделитель записей для интервала.

и при использовании обновленного примера мы добираемся:

>cat file1
eipassoc-03cd9117d7188d2 eipasoc-47367a3f eipasoc-bbbddc3 eipassoc-10bbfb6
>cat file2
eipasoc-47367a3f eipassoc-10bbfb6
>cat file1 | sed 's/ /\n/g' |grep -vf <(cat file2|sed 's/ /\n/g') | tr '\n' ' '; echo
eipassoc-03cd9117d7188d2 eipasoc-bbbddc3 
>
>

Если Вы склонны использовать AWK, вот пример:

>cat file1
eipassoc-03cd9117d7188d2 eipasoc-47367a3f eipasoc-bbbddc3 eipassoc-10bbfb6
>cat file2
eipasoc-47367a3f eipassoc-10bbfb6
>cat file1 | sed 's/ /\n/g' |grep -vf <(cat file2|sed 's/ /\n/g') | tr '\n' ' '; echo
eipassoc-03cd9117d7188d2 eipasoc-bbbddc3 
>
>

Здесь я использую взлом, чтобы рассматривать первый файл как поиск (НОМЕР == FNR) и сохранить чтение строк в карте, и затем непервые файлы будут проверены по поиску. Вы получаете рекордное разделение бесплатно, но код становится неясным, потому что это зависит от побочных эффектов

0
ответ дан 24 October 2019 в 00:01

$ ID= (описывать-адреса aws ec2 - регион us-west-2 - запрашивают 'Адреса [].AssociationId []' - синтезируемый текст>> AId.txt),
$ IP= (описывать-адреса aws ec2 - регион us-west-2 - запрашивают 'Адреса [].PublicIp []' - синтезируемый текст>> OIP.txt),

считайте массив-a <<<$ (кошка AId.txt)
сенсорный NR.txt
поскольку я в $ {массив};
сделать
$ эха (описывать-адреса aws ec2 - регион us-west-2 - фильтрует "Name=association-id, $i Values=" - запрос 'Адреса [].PublicIp []' - синтезируемый текст),>> NR.txt
готово

считайте-a array1 <<<$ (кошка OIP.txt)
сенсорный RIps.txt
поскольку я в $ {array1};
сделать
$i эха>> RIps.txt
готово

$ l1= (сокращает-d" "-f 1-RIps.txt),
$ l2= (сокращает-d" "-f 1-NR.txt),
повторите "$ {l1}" "$ {l2}" | TR '''\n' | вид | uniq-u | xargs-L 2> result.txt

все ответы, данные предыдущим, корректны, кроме моего файла, который я загружал, имеет неизвестные символы, который является, почему я пытался хранить их в файле линию за линией вместо всего в одной строке. и затем код работал. спасибо всем.

0
ответ дан 24 October 2019 в 00:01

Другие вопросы по тегам:

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