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