Заменить поле в одном файле на основе совпадения с другим полем в другом файле

С zsh оболочка, Вы могли сделать:

cd /data/db/OX || exit
latest_two=(<->_<->(N/nOn[1,2])
(($#latest_two == 2)) || exit
cp -p $latest_two[2]/pt.* $latest_two[1]/

POSIXly, принимающие имена файлов, не содержат символы новой строки:

cd /data/db/OX || exit
set -- $(ls -F |
  grep -xE '[0-9]+_[0-9]+/' |
  sort -rnt _ -k 1,1 -k 2,2 |
  head  -n 2)
[ "$#" -eq 2 ] || exit
cp -p "$2"pt.* "$1"

Оба делают то же:

  1. Они получают список каталогов, которые похожи number_number
  2. Вид их реверс численно (не, вид-rn)
  3. выберите первые два
  4. копия pt.* файлы от второго до первого.
4
13.08.2015, 08:41
2 ответа

( изменение из моего ответа здесь ... )

Вы можете сравнить NR с FNR , чтобы различать обработку первого и последующих файлов. Это связано с тем, что FNR сбрасывается для каждого файла, а NR является текущим счетом. Следовательно, только во время обработки первого файла будет выполнено условие NR == FNR .

Чтобы сначала обработать FileB ...

awk 'NR==FNR{a[$1]=1}'

Достаточно установить «фиктивное» значение, например 1 .

Затем, чтобы обработать FileA ...

awk -F'\t' 'BEGIN{OFS=FS}NR!=FNR{if(a[$4]){$1="Reserved"};print}'

Здесь разделитель выходных полей OFS установлен как FS , чтобы сохранить форматирование, когда awk восстанавливает полная строка ( $ 0 ).

Объединение обоих вместе:

awk -F'\t' 'BEGIN{OFS=FS}NR==FNR{a[$1]=1}NR!=FNR{if(a[$4]){$1="Reserved"};print}' FileB FileA

Если вы хотите, чтобы он был немного более лаконичным ...

awk -F'\t' 'BEGIN{OFS=FS}NR==FNR{a[$1]=1;next}a[$4]{$1="Reserved"}1' FileB FileA

следующий используется при обработке первого файла чтобы пропустить окончательную печать, обозначенную (final) 1 , что является сокращением для выполнения {print $ 0} . При этом мы можем сместить условие a [$ 4] (т.е. истинно , если оно существует в r ) «вне», чтобы оно стало условием для определения того, будем ли мы необходимо изменить $ 1 на «Зарезервировано» или нет.

3
27.01.2020, 20:55

Это можно сделать с помощью awk :

awk -F"\t" '{if(NF==1){arr[$1]=$1}else{if(arr[$4]==$4){$1="Reserved"}{print $0}}}' fileB, FileA

Постоянная переменная NF указывает количество полей в файле, в этом коде awk сначала прочитает FileB и поместит все свои данные в массив с именем arr в FileA, если четвертое поле $ 4 = значение массива (IP-адрес), тогда имя хоста заменяется на зарезервированное.

из ваших образцов, это выведет:

Reserved IN A 10.10.20.1 
Reserved IN A 10.10.20.2 
hostname3 IN A 10.10.20.3
1
27.01.2020, 20:55

Теги

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