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

Как насчет

awk '
  NR==FNR {a[substr($2,2,length($2)-2)] = $0; next} 
  {print a[$1]}
' file_1 file_2
4.96798703303702 "YPL223C"
3.66402710414498 "YBR117C"
4.96798703303702 "YPL223C"
3.66402710414498 "YBR117C"
5.79159144125629 "YMR175W"
5.79159144125629 "YMR175W"
-4
17.09.2021, 18:46
4 ответа

Оба файла содержат "миллионы записей"? Выберите более короткий файл, прочитайте каждую строку, сгенерируйте регулярное выражение, начинающееся с " ^" (начало строки ), заканчивающееся на " $" (конец строки ), с поиском строка между ними. Установите позиции, которые вы хотите игнорировать, на " ." (регулярное выражение "соответствует любому одиночному символу" ). Например. «^abc...def...$». Сохранить во временном файле(file1.tmp)(миллионов? ). Когда вы обработаете все строки, grep -E -f file1.tmp file2будет искать регулярные выражения в file1.tmpв file2.

0
17.09.2021, 19:35

Использование GNU awk для параметра FIELDWIDTHS:

$ paste file[12] |
    awk -v FIELDWIDTHS='3 3 3 3 1 3 3 3 3' '$1!=$6 || $3!=$8'
ghi456klm999    xxx000yyy000

Здесь мы использовали команду paste, чтобы вставить оба файла рядом; затем предположим, что строки в обоих файлах имеют фиксированную длину, поскольку мы использовали параметр awk FIELDWIDTHS для определения длины полей, а затем мы сравниваем связанные поля на предмет разницы; сравнение здесь построчное.

В качестве альтернативы можно использовать любой awk в любой оболочке:

$ paste file[12] |
    awk 'function key(s){return substr(s,1,3) substr(s,7,3)} key($1) != key($2)'
ghi456klm999    xxx000yyy000
4
17.09.2021, 19:38

Вы не показали ожидаемый результат и не рассказали нам, каковы ваши требования, поэтому вот одно предположение о том, что вам может понадобиться, используя любой awk в любой оболочке на каждой машине Unix:

$ cat tst.awk
{ key = substr($0,1,3) substr($0,7,3) }
NR == FNR {
    a[key]
    next
}
!(key in a)

$ awk -f tst.awk file1 file2
xxx000yyy000

$ awk -f tst.awk file2 file1
ghi456klm999
1
18.09.2021, 02:52

Это awkрешение также может работать.

#!/usr/bin/env bash

first_slice () {
    awk -F"[0-9]" 'FNR==NR {array[$1$3]=$0;next} {for (non_matching in array); req_data=array[non_matching]} END {print req_data}' t2 t1
}
second_slice () {
    awk -F"[0-9]" 'FNR==NR {array[$1$3]=$0;next} {for (non_matching in array); req_data=array[non_matching]} END {print req_data}' t1 t2
}

first_slice
second_slice

Выход

xxx000yyy000
ghi456klm999
0
18.09.2021, 17:03

Теги

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