Сравните два файла (файл1 и файл2) и добавьте один столбец из файла2 в файл1, если первый столбец из двух файлов совпадает - PullRequest
1 голос
/ 17 февраля 2020

У меня есть два файла (file1 и file2)

file1

ABC=14.2.0.7.SAMPLE=git.xyz/plugins/gitiles/+/refs/heads/clientpatch/abc/patch142007
DEF=14.3.0.5.SAMPLE=git.xyz/plugins/gitiles/+/refs/heads/clientpatch/def/patch143005
DEF=14.3.0.5.SAMPLE2=git.calypso/plugins/gitiles/+/refs/heads/clientpatch/def/patch14300-calib
HIJ=12.0.0.0.Sp3.SAMPLE3=git.xyz/plugins/gitiles/+/refs/heads/clientpatch/hij/patch120000sp3
MNO=16.1.0.28.SAMPLE=git.xyz/plugins/gitiles/+/refs/heads/clientpatch/mno/patch161028

....... (150 строк)

file2

IJK = open 
ABC = closed 
PQR = closed 
DEF = open 
HIJ = open 
LMN = closed
MNO = closed 
PQR = open

...... (> 150 строк)

выходной файл

ABC=14.2.0.7.SAMPLE=git.xyz/plugins/gitiles/+/refs/heads/client/abc/patch142007=closed
DEF=14.3.0.5.SAMPLE=git.xyz/plugins/gitiles/+/refs/heads/client/def/patch143005=open
DEF=14.3.0.5.SAMPLE2=git.xyz/plugins/gitiles/+/refs/heads/client/def/patch14300-calib=open
HIJ=12.0.0.0.Sp3.SAMPLE3=git.xyz/plugins/gitiles/+/refs/heads/client/hij/patch120000sp3=open
MNO=16.1.0.28.SAMPLE=git.xyz/plugins/gitiles/+/refs/heads/client/mno/patch161028=closed

Я пробовал следующий скрипт. Но это не дает мне никакого выхода. Даже не печатая ничего. Без ошибок

while IFS= read -r line
do
key1=`echo $line | awk -F "=" '{print $1}'` < file1
key2=`echo $line | awk -F "=" '{print $2}'` < file1 
key3=`echo $line | awk -F "=" '{print $3}'` < file1 
key4=`echo $line | awk -F "=" '{print $1}'` < file2   
value3=`echo $line | awk -F "=" '{print $2}'` < file2   
if [ "$key1" == "$key4" ]; then   
echo "$key1=$key2=$key3=$value3"   
fi   
done 

Дается краткое описание того, как должен работать код.

Код должен сравнивать первые столбцы двух файлов (file1 и file2). Если каждое имя совпадает, это должно дать мне выходной файл, как указано выше. Остальное go на следующую строку. Я должен получить вывод, если мои два файла в отсортированном или несортированном формате. Помощь будет оценена. Спасибо

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Или другой подход с awk, который хранит значения file2 в массиве и затем добавляет правильное состояние к соответствующей строке в file1:

awk -F' = ' 'NR==FNR {a[$1]=$2; next} {print $0"="a[$1]}' file2 FS="=" file1

Пример использования / Выход

$ awk -F' = ' 'NR==FNR {a[$1]=$2; next} {print $0"="a[$1]}' file2 FS="=" file1
ABC=14.2.0.7.SAMPLE=git.xyz/plugins/gitiles/+/refs/heads/clientpatch/abc/patch142007=closed
DEF=14.3.0.5.SAMPLE=git.xyz/plugins/gitiles/+/refs/heads/clientpatch/def/patch143005=open
DEF=14.3.0.5.SAMPLE2=git.calypso/plugins/gitiles/+/refs/heads/clientpatch/def/patch14300-calib=open
HIJ=12.0.0.0.Sp3.SAMPLE3=git.xyz/plugins/gitiles/+/refs/heads/clientpatch/hij/patch120000sp3=open
MNO=16.1.0.28.SAMPLE=git.xyz/plugins/gitiles/+/refs/heads/clientpatch/mno/patch161028=closed
1 голос
/ 17 февраля 2020

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

awk '
BEGIN{
  OFS="="
}
FNR==NR{
  a[$1]=$NF
  next
}
($1 in a){
  print $0,a[$1]
}
'   Input_file2  FS="="  Input_file1

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

awk '                   ##Starting awk program from here.
BEGIN{                  ##Starting BEGIN section from here.
  OFS="="               ##Setting OFS as = here for all lines.
}
FNR==NR{                ##Checking condition if FNR==NR which will be TRUE when file2 is being read.
  a[$1]=$NF             ##Creating an array a with index $1 and value is last field.
  next                  ##next will skip all further statements from here.
}
($1 in a){              ##Checking condition if $1 of current line is present in array a then do following.
  print $0,a[$1]        ##Printing current line and value of array a with index $1.
}
'  file2 FS="=" file1   ##Mentioning Input_file file2 and file1 and setting FS="=" for file1 here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...