Это выполнит работу:
Иначе просто распечатайте его и выведите следующий элемент
awk '{
for (i = 1 ; i <= NF; i ++) {
t + = $ i; if (i == 1) {
if ($ i == "To" || $ i == "Tomin" || $ i == "Tomax") {
printf "% s", $ i;
print $ (i + 1) +1;}
{{1} } else {
print $ 0
}
}
};
} 'current.txt
ВЫХОД
Date 2016-Dec-03
Time 10:30:29
Ti 11.9
Timin 11.6
Timax 27.7
TTin 10:34
DTimin 2016-01-19
TTimax 00:44
DTimax 2016-08-28
To -1.4
Tomin -3.8
Tomax 38.4
TTomin 06:46
DTomin 2016-02-18
TTomax 16:13
DTomax 2016-07-19
Короткий awk-скрипт
awk '
NR == FNR { names["R"$2]; next }
$2 == "Name:" { replace = ($3 in names) }
$1 == "type" && replace { sub(/type.*/, "type 700;") }
1
' file1 file2
NR и FNR являются встроенными переменными awk. NR подсчитывает общее количество просмотренных строк. FNR — это количество строк в текущем файле, просмотренных на данный момент. NR == FNR
— это идиома awk, которая означает «Я работаю с первым файлом данных» --— единственный файл, для которого номер текущей записи будет равен общему номеру записи.
Итак, читая первый файл, мы хотим сохранить "ключи", которые находятся во 2-м столбце. Хранение их в качестве ключа ассоциативного массива «names» — удобное место, учитывая оператор in
, который мы будем использовать позже. Я добавляю букву «R» к ключу, потому что она есть во втором файле.
Когда $2 == "Name:"
, мы находимся в начале раздела. Мы хотим заменить значения типа, если 3-е слово в этой строке было замечено в первом файле. ($3 in names)
проверяет, появляется ли 3-е слово как ключ в ассоциативном массиве names
. Если он есть, то мы выполним замену для любых последующих строк, где 1-е слово — «тип».
Последняя строка сценария интересна. 1
— еще одно идиоматическое сокращение, указывающее awk на печать текущей строки. awk-программы представляют собой серию condition {action}
пар :, если выполняется условие, выполнять заданные действия. Условие можно опустить, в этом случае действие выполняется для каждой строки. Условие может быть задано без блока действий, и в этом случае действие по умолчанию — напечатать текущую строку. awk считает пустые строки и ноль ложными, поэтому условие 1
всегда истинно. Когда я чувствую себя более многословным, я пишу {print}
вместо 1
, чтобы сделать его более очевидным.
С помощью awk-скрипта GNU, как показано ниже:
NR == FNR {
strt=1
}
strt == 0 {
if (match($0,/Name/)) {
id=substr($0,RSTART,length($0))
id=gensub("R","","g",id)
}
file2[id]=file2[id]"\n"$0
}
FNR == 1 && NR != 1 {
strt=0
file2[$0]=""
}
strt == 1 {
file1[$0]=$0
}
END {
for (i in file2) {
if (file1[i] != "") {
resp=gensub(/[[:blank:]]{5}type.*;/," type
700;","g",file2[i])
print resp
}
else {
print file2[i]
}
}
}
Считайте два файла в отдельные массивы (файл1, файл2 )с указанием, например, «Имя :0603». В конце выполните цикл по массиву file2, совпадающему с file1. Если в файле1 есть запись, используйте gensub для сопоставления и замены шаблона, в противном случае просто напечатайте запись в файле2.
действие с:
awk -f scriptfile file1 file2