Я столкнулся с этим на своей OS X " Terminal "на хосте Fedora Server 25. Я окончательно решил эту проблему в моем .vimrc с помощью:
set mouse=
set ttymouse=
Теперь я могу прокрутить до моей предыдущей истории bash в прокрутке моего терминала с помощью мыши.
{{ 1}}awk -F'|' 'NR==FNR{e[$2$1]=1;next};e[$4$8]' file2.txt file1.txt
Сначала прочтите файл2 и установите массив e [поле2 + поле1]
, затем файл1 и напечатайте, если установлено e [field4 + field8]
.
Или переверните поля:
awk -F'|' 'NR==FNR{e[$1$2]=1;next};e[$8$4]' file2.txt file1.txt
попробуйте
awk 'BEGIN { FS="|"}
FNR == NR { key[$2 $1]=NR }
FNR > NR { k=$3 $8 ;if (k in key) print ;} ' file2.txt file1.txt
где
BEGIN {FS = "|"}
скажите aw использовать |
в качестве разделителя (вы можете использовать -F \ |
в командной строке) FNR == NR {key [$ 2 $ 1] = NR}
запомнить ключ из файла (в файле file2.txt) FNR> NR {k = $ 4 $ 8; if (k в ключе) print;}
если введите хэш-список, распечатайте его Изменить: вы упоминаете третье поле и присоединяетесь к четвертому.
Проще, предполагая, что в файле2 не разрешено указывать одно и то же первое поле дважды:
awk -F'|' 'FNR == NR { key[$1] = $2; next } $8 in key && key[$8] == $4' file2.txt file1.txt
Вопрос помечен как awk , но я думаю, стоит отметить, что у вас нет , чтобы использовать awk
для этого. В coreutils есть утилита join
, которая полезна для такого рода вещей, хотя с вашими данными она немного громоздка.
Я предполагаю, что ваша оболочка - это bash и GNU coreutils. Это можно сделать с другими вариантами, но, вероятно, потребуется дополнительная предварительная / постобработка ваших данных.
Без лишних слов:
join -t"|" -14 -22 -o"$(echo 1.{1..8} 2.1)" \
<(sort -t"|" -k4 file1.txt) \
<(sort -t"|" -k2 file2.txt) \
| grep -Po ".*([\d]+)(?=\|\1$)"
join
принимает два входных файла и объединяет их в полях, переданных с параметрами -1
и -2
. -t
указывает настраиваемый разделитель полей во входных файлах. join
требует, чтобы входные файлы были отсортированы по объединяемым полям, поэтому два входных файла сортируются в рамках подстановок процессов перед передачей в join
. Параметр -o
определяет способ вывода полей. По умолчанию это поле соединения, за которым следуют поля без соединения файла file1, за которыми следуют поля без соединения файла file2, поэтому нам нужно указать, что мы хотим, чтобы все поля файла 1 были по порядку, а затем поле 1 файла 2.
Вам также необходимо, чтобы соединение было в поле 8 файла file1 и поле 1 файла file1. Здесь это просто реализуется путем поиска строк при совпадении выходных полей 8 и 9 соединения. Использование упреждающего выражения регулярного выражения с grep -Po
позволяет нам сделать это и эффективно удалить поле 9, чтобы получить требуемый результат. Результат:
78Z|696931836|0000001|ANT09|2160203|A|1114450|2222222222
78Z|011512345|0000001|ANT09|2160218|D|0319230|4444444444
78Z|033333157|0000001|ANT10|2160208|A|1900460|3333333311
78Z|099999999|0000001|ANT32|2160219|A|0319000|6666666666
78Z|010041586|0000001|ANT33|2160119|A|1835100|3333333333
78Z|012344052|0000001|ANT50|2160203|A|1219570|5555555555