Соберите два файла и напечатайте строки с несколькими совпадениями

попробуйте эту команду awk

awk 'NR==FNR{Arr[$0]++;next}{if($1 in Arr){print $0}}' input_file master_file

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

1
23.09.2020, 15:56
2 ответа

Сохраните каждое значение file1.txtв массиве a. Затем проанализируйте file2.txtи выведите строки, которые имеют как 1-е, так и 2-е поле в a.

awk 'NR==FNR{a[$0];next}$1 in a && $2 in a' file1.txt file2.txt

Для произвольного количества полей в file2.txtвыполните цикл по всем полям и выполните проверку. Если одного из полей нет в a, перейдите к следующей строке,иначе напечатайте строку.

awk 'NR==FNR{a[$0];next}{for(i=1;i<=NF;i++){if(!($i in a)){next}}print}' file1.txt file2.txt
3
18.03.2021, 23:03

Используя python, мы можем приблизиться к pbm, создав надмножество b, которое включает элементы file1.txt.

Затем для каждой строки, прочитанной из file2.txt, мы проверяем, является ли множество, сформированное из этой текущей строки, подмножеством надмножества b. В этом случае мы печатаем текущую строку файла file2.txt`

$ python3 -c 'import sys
f1, f2 = sys.argv[1:]
with open(f1) as fh1, open(f2) as fh2:
  b = set([l.strip() for l in fh1])
  print(*(l.rstrip() for l in fh2 if set(l.strip().split()).issubset(b)), sep="\n")
' file1.txt file2.txt

abc ghi
mno jkl
$ perl -lane '$. == 1 and 
    %h = map { /(.*)(\n)/ } <STDIN>;
    print if ! grep { ! $h{$_} } @F;
' file2.txt < file1.txt

Используя sed, мы сохраняем файл file1.txt в области хранения, а затем для каждой строки, прочитанной из File2.txt, мы сравниваем наличие ВСЕХ элементов текущей строки и печатаем, когда все найдено.

$ sed -Ee '
    /\n/{h;d;}
    /\s/!{H;d;}
    G;h
    s/\n.*//;s/\n//;x
    :a
      s/^\s?(\S+)((\s\S+)?\n.*\n\1(\n|$))/\2/
    ta
    s/^\n//;tb
    D;:b;x
' file1.txt file2.txt
while IFS= read -r l <&3; do
  read -r a b <<<"$l"
  grep -qFe "$a" file1.txt &&
  grep -qFe "$b" file1.txt &&
  printf '<%s>\n' "$l"
done 3< file2.txt
0
18.03.2021, 23:03

Теги

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