Создание нового файла при сравнении двух столбцов в двух файлах с использованием awk - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь сравнить два файла (f1, f2) и создать третий файл f3. если поле $ 1 одинаково в обоих файлах, тогда сгенерируйте запрос sql следующим образом:

файл f1

db1
db2
db3

файл f2

db1 tab11
db1 tab12
db1 tab13
db2 tab21
db2 tab22
db3 tab31
db3 tab32
db3 tab33
db3 tab34

файл f3


    ( TRIM(C.DATABASENAME) = 'db1' AND C.TABLENAME IN ('tab11', 'tab12','tab13')) OR
    ( TRIM(C.DATABASENAME) = 'db2' AND C.TABLENAME IN ('tab21', 'tab22')) OR
    ( TRIM(C.DATABASENAME) = 'db3' AND C.TABLENAME IN ('tab31', 'tab32', 'tab33','tab34' ))


Возможно ли создать файл f3 с помощью awk?

это то, что я придумал, но он генерирует файл с неверным форматом данных

while read db; do
awk -v mydb=$db '{if ($1=mydb) printf "( TRIM(C.DATABASENAME) ="$1 "AND C.TABLENAME IN (" $2 "," }' f2 > f3
done < f1

Ответы [ 2 ]

1 голос
/ 21 января 2020

Не могли бы вы попробовать следующее.

awk '
BEGIN{
  s1="\047"
  OFS=", "
}
FNR==NR{
  a[$1]=(a[$1]?a[$1] OFS:"")s1 $2 s1
  next
}
($1 in a){
  print "( TRIM(C.DATABASENAME) = " s1 $1 s1 " AND C.TABLENAME IN (" a[$1]" )) OR"
}
'  Input_file2   Input_file1

Вывод будет следующим.

( TRIM(C.DATABASENAME) = 'db1' AND C.TABLENAME IN ('tab11', 'tab12', 'tab13' )) OR
( TRIM(C.DATABASENAME) = 'db2' AND C.TABLENAME IN ('tab21', 'tab22' )) OR
( TRIM(C.DATABASENAME) = 'db3' AND C.TABLENAME IN ('tab31', 'tab32', 'tab33' )) OR


Объяснение: Добавление подробного пояснения к вышеуказанному коду.

awk '                                               ##Starting awk program from here.               
BEGIN{                                              ##Starting BEGIN section of this program here.
  s1="\047"                                         ##Creating value of variable s1 to \047 which is octal value of single quote.
  OFS=", "
}
FNR==NR{                                            ##Checking condition FNR==NR which will be TRUE when first Input_file named file2 is being read.
  a[$1]=(a[$1]?a[$1] OFS:"")s1 $2 s1                ##Creating an array named a whose index is $1 and its value is $2 which is keep on adding to its own value for whole Input_file2.
  next                                              ##next will skip all further statements from here.
}
($1 in a){                                          ##Checking condition if $1 of Input_file1 current line is present in array a then do following.
  print "( TRIM(C.DATABASENAME) = " s1 $1 s1 " \
AND C.TABLENAME IN (" a[$1]" )) OR"                 ##Printing exact line like OP said.
}
'  file2  file1                                     ##Mentioning Input_file names here.
0 голосов
/ 20 января 2020

Вы должны быть в состоянии сделать практически все, что вы хотите в awk, но вы, вероятно, хотите использовать что-то еще здесь:

  • вы можете использовать join(1) для фильтрации file2 (join file1 file2 вернет только те строки file2, которые соответствуют записи file1)
  • , вы можете легко использовать awk для группировки таблиц по базе данных
  • , однако окончательное форматирование (что вы сделаете в END pattern) будет абсолютным адом, потому что join (ar, sep) довольно плохо поддерживается в awk , и поскольку он должен быть здесь вложенным, это будет беспорядок.

Вам было бы намного проще использовать что-то вроде Python или Ruby или PHP. Черт, я думаю, тебе будет проще использовать bash.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...