2014-12-17 2 views
-1

Я делаю сравнение 2 файлов file1, file2, используя первый столбец в файле1, в первый столбец в файле2 и возвращая соответствующее значение из 7-го столбца.Печать сравниваемого результата в последнем заголовке столбца

awk -F, 'FNR==NR{a[$1]=$7;next} {print (($1 in a) ? $0","a[$1] : $0",NA");}' file2.txt file1.txt > tmp && mv tmp file1.txt 

также на следующий день он будет сравнивать и добавлять результат.

cat file1.txt 

N1,N2,N3,N4,N5,N6,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10 
XX,ZZ,XC,EE,RR,BB,OK,OK,OK,OK,OK,OK,OK,OK 
XC,CF,FG,RG,GH,GH,NA,NA,NA,NA,NA,NA,NA,NA,NA 
DM,DF,GR,TH,EW,BB 

cat file2.txt 

cat file2.txt 
DF,GH,MH,FR,FG,GH,NA 
XX,ZZ,XC,EE,RR,BB,OK 

awk -F, 'FNR==NR{a[$1]=$7;next} {print (($1 in a) ? $0","a[$1] : $0",NA");}' file2.txt file1.txt > tmp && mv tmp file1.txt 

mv: overwrite `file1.txt '? у

cat file1.txt 
N1,N2,N3,N4,N5,N6,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,NA ---> Header 
XX,ZZ,XC,EE,RR,BB,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK 
XC,CF,FG,RG,GH,GH,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA 
DM,DF,GR,TH,EW,BB,NA 

после добавления новой строки

DM,DF,GR,TH,EW 

проблема это сравнение и результат печати для заголовка также и результат печатается под заголовком D1 вместо D10 для вновь вставленной строки в файла1

Как мы можем печатать таким образом, сравнение должно исключать заголовок и результат под заголовком последнего столбца

N1,N2,N3,N4,N5,N6,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10 
XX,ZZ,XC,EE,RR,BB,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK 
XC,CF,FG,RG,GH,GH,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA 
DM,DF,GR,TH,EW,BB       ,NA 

ответ

0

Чтобы избежать заголовка обновляется, выражение изменения AWK на следующее:

'FNR==NR{a[$1]=$7;next} FNR==1{print $0; next} {print (($1 in a) ? $0","a[$1] : $0",NA");}' 

В этом случае 1-й линии file1.txt будет печататься как есть, без каких-либо изменений.

Но вам также не нужно добавлять новый новый день (например, «D10» в примере) к заголовку при каждом запуске? Или вы делаете это в другом месте?

Что касается 2-я вопроса (печать нового значения в той же позиции в строке для более короткой линии, как и для более длинной линии), вы должны дополнительно изменить AWK:

'FNR==NR{a[$1]=$7;next} FNR==1{print $0; len=length($0); next} {printf $0; cont=(($1 in a) ? ","a[$1] : ",NA"); for (i=length($0)+1;i<=len-length(cont);i++) printf " " ; print cont;}' 
+0

Вы можете удалить '$ 0' от 'print $ 0'. Он выполнит действие по умолчанию, распечатает строку. – Jotne

+0

@ Jotne: Да, я знаю, но предпочитаю этот способ для ясности и удобочитаемости. –

+0

Но как объединить оба условия? –

Смежные вопросы