Рассмотрим следующие файлы:
file1
:
boo,8,1024
foo,7,2048
file2
:
foo,0,24,154
noo,0,10,561
file3
:
24,154,7,1024,0
Что мне нужно, это пойти в File1 и проверить, если $2==7
; если это правда, взять $1
, $2
и $3
от File1 ; Теперь я должен сравнить, если $1
из File1 равно $1
из File2 ; если это правда, я должен взять $3
и $4
из Файл2 , которые не существуют в File1 , то я должен пойти file3 и проверить , если $1
от file3 равно $3
от Файл2 , и $2
от file3 равно $4
от Файл2 ; если да, то я должен проверить, если $2
из File1равно $3
из File3 , то, если это условие истинно, я должен сравнить $3
с File1 с $4
из File3 , если $3
из File1 больше, чем $4
из File3 .
Я попробовал следующий скрипт:
cat [file1] [file2] [file3] |
awk -F,
'{if(NF==3)
{if($2==7){a[$1]=$1; b[$1]=$2; c[$1]=$3}
}else
{if(NF==4){if(a[$1]==$1){d[$3]=$3; e[$4]=$4}
}else
{if(NF==5){if(d[$1]==$1 && e[$2]==$2){print a[$1], b[$1], c[$1], d[$1]}}
}
}
}'
Желаемый результат:
foo,7,2048,24,154,1024
text-processing
awk
gawk
Eng7
источник
источник
Решение TXR:
Запустить:
Но проницательный наблюдатель заметит, что цифра 7 не указана нигде в коде, а только в выводе! Это потому, что код на самом деле проходит через все записи
file1
и печатает все комбинации, которые соответствуют совпадениям и ограничениям . Единственный в данных образца - это тот, ктоval0
был7
.Если бы было найдено больше комбинаций, это можно было бы ограничить только
7
такой:Язык извлечения шаблонов TXR обеспечивает здесь одно большое сопоставление шаблонов с неявными обратными ссылками посредством повторения имен переменных, охватывающих несколько файлов, с многострочными шаблонами извлечения и нетекстовыми ограничениями, плюс встроенные побочные эффекты, такие как вывод и т. Д. ,
Принятое решение Awk тщательно перевело
awk
макрос TXR Lisp :Запустить:
,1024
Требуется часть на выходе отсутствует; оригинальный "Awk Classic" имеет такое поведение.источник