Функция оболочки. Это будет работать в любой оболочке, которая поддерживает строки <<<
здесь -, включая zsh и bash.
xyz() {
while read line
do
printf "%s " "$line"
"$@" <<<"$line"
done
}
$ (echo "foo"; echo "bar") | xyz rev
foo oof
bar rab
Используя python
, мы сначала создаем список объектов диапазона из файла 2.txt и сохраняем его в переменной LoR. Идея состоит в том, чтобы проверить наличие целевого поля, если file1.txt (в нашем случае целевое поле второе ).
python3 -c 'import re, sys
## unpack command line arguments
if1,if2,col = sys.argv[1:]
idx = int(col) - 1
fx = lambda x: n in x
d2u = re.compile(r"\r?\n")
with open(if1) as f1, open(if2) as f2:
LoR = [range(int(a),1+int(b))
for _ in f2
for l in [re.sub(d2u,"",_)]
for a,b in [l.split()]]
for l in f1:
_ = re.sub(d2u,"",l)
F = _.split()
if len(F) < int(col): continue
n = int(F[idx])
if any(filter(fx,LoR)):
print(_)
' file1.txt file2.txt 2
Тот же подход, что и выше, но с Perl:
perl -MList::Util=any -lane '
BEGIN {
@LoR = map { [/(\S+)\s+(\S+)/] } <STDIN>;
$idx = -1+pop;
}
s/\r$//;
my $n = $F[$idx];
print if any { $_->[0] <= $n and $n <= $_->[1] } @LoR;
' file1.txt < file2.txt 2