С 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"
Оба делают то же:
number_number
pt.*
файлы от второго до первого.( изменение из моего ответа здесь ... )
Вы можете сравнить 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
на «Зарезервировано»
или нет.
Это можно сделать с помощью 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