Linux / Bash: заменить, если тот же идентификатор в таблице - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть два файла:

file 1
Name   Height
Jay    180
Kathy  171
Amy    163
Bill   176
Hellen 157

file 2
Name   Height
Jay    195
Amy    173
Hellen 161

, и я хочу заменить значение во втором столбце файла 1, если имена (столбец 1) совпадают в файле 2. Если имена не совпадают,затем остаются без изменений.Результат должен быть таким:

Name   Height
Jay    195
Kathy  171
Amy    173
Bill   176
Hellen 161

Только высота Джея, Эми и Хеллен изменилась, потому что их имя существует в файле 2.

Я пытался решить это с for loop plus awk или join, но не очень хорошо.В конце я использовал Excel для генерации команды LONG awk из файла 2 и применил ионный файл 1, он работал:

awk '{OFS="\t";
if($1~/^Jay$/){$2="195"; print $0;} 
else if($1~/^Amy$/){$2="173"; print $0;} 
else if($1~/^Hellen$/){$2="161"; print $0;} 
}' file 1

Таким образом я попытался использовать цикл for для генерации:

else if($1~/^   Amy   $/){$2="   173    ";print $0;}  

Над ним находится команда part1 & name & command part2 & height для замены & command part3.Но трудно поместить эти команды в переменную, потому что она содержит специальные символы, такие как: if, ~, /, $

Мне интересно, есть ли какой-нибудь более простой способ сделать это только командой?Спасибо!

Чарли

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

если заказ не важен, он может быть таким же простым, как

$ awk '!a[$1]++' file2 file1

Name   Height
Jay    195
Amy    173
Hellen 161
Kathy  171
Bill   176
0 голосов
/ 20 ноября 2018

Этот скрипт тоже подойдет.

#!/bin/bash

while read name height
do
        printed=0
        printf "$name\t"
        while read subname subheight
        do
                [[ $name == $subname ]] && printf "$subheight\n" && printed=1
                continue
        done <<< "$( tail -n +2 secondary.txt)"
        [[ $printed -eq 0 ]] && printf "$height\n"

done <<< "$( tail -n +2 main.txt)"
0 голосов
/ 20 ноября 2018

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

awk 'FNR==NR{a[$1]=$2;next} {$0=a[$1]?$1 OFS a[$1]:$0} 1'  file2  file1 | column -t

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

Name    Height
Jay     195
Kathy   171
Amy     173
Bill    176
Hellen  161
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...