файл поиска строки (взятой из файла), а затем заменить любой экземпляр другой строки, которая попадает в первое совпадение

Это выполнит работу:

  1. Сначала пройдутся все строки
  2. Затем проверьте первый элемент и проверьте, соответствует ли он тому, что вы хотите.
  3. Затем, если он совпадает, распечатайте его и добавьте +1 к следующему элементу в строке
  4. Иначе просто распечатайте его и выведите следующий элемент

     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
2
10.08.2017, 15:42
2 ответа

Короткий 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, чтобы сделать его более очевидным.

1
27.01.2020, 22:18

С помощью 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
0
27.01.2020, 22:18

Теги

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