В прежние времена (в 1970-х )люди действительно писали простой код, который делал вещи трудными для понимания. С этим связаны другие ответы.
Если вы используете оболочку, которой меньше 30 лет, вы можете сделать это более понятным способом.:
umask g+w
Это лучше, так как в этом режиме маска инвертируется.
Фон :интерфейс ядра по-прежнему управляет маской, которая применяется к третьему параметру open()
.
С 1988 (с ksh88 )был установлен новый интерфейс оболочки для команды chmod
в оболочке.
umask -S
печатает маску режима создания файла в современном символическом синтаксисе chmod
и
umask u=rw,g=rw,o=r
позволяет установить маску создания файла, используя синтаксис chmod
.
awk 'NR==FNR{a[$1];next}{n=split($NF,b,";");for(i=1;i<=n;i++){if(b[i] in a){print;break}}}' file2 file1
Размотанный вариант:
awk '
NR==FNR{a[$1];next}
{
n=split($NF,b,";")
for(i=1;i<=n;i++){
if(b[i] in a){print;break}
}
}
' file2 file1
split($NF,b,";")
разбивает последнее поле точкой с запятой и помещает результаты в массив b
. Он возвращает количество элементов b
, которое присваивается n
. В вашей строке примера n=2
, b[1]=166486
и b[2]=1897048
.
if(b[i] in a){print;break}
если есть точное совпадение, печатается строка и цикл прерывается, чтобы не печатать одну и ту же строку дважды.
Структура данных python set
дает нам способ сравнить и найти, находится ли одно из чисел, разделенных точкой с запятой -, в другом наборе, который сформирован номерами файла2. Устанавливаем пересечение, когда получается непустое, идем дальше и печатаем текущую строку.
python3 - file1 file2 <<\eof
import sys
data, pat = sys.argv[1:]
rs, fs = '\n', '\t'
with open(pat) as fp, open(data) as fd:
pats = set(fp.read().splitlines())
for l in fd:
s = l.rstrip(rs).split(fs)[-1].split(';')
if set(s) & pats: print(l, end='')
eof
команда
awk 'NR == FNR {a[$1];next}FS=";"($NF in a){print $0}' f2 f1
выход
NODE_1_length_45927_cov_22.029055_g0_i0 WP_055195622.1 93.1 729 50 0 291 2477 1 729 0.0e+00 1275.4 166486;1897048