Проблема с заменой чисел на слова из файла - PullRequest
0 голосов
/ 14 апреля 2019

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

В первом (champions.csv) у меня есть номер и имя некоторых чемпионов LoL

1,Annie
2,Olaf
3,Galio
4,Twisted Fate
5,Xin Zhao
6,Urgot
7,LeBlanc
8,Vladimir
9,Fiddlesticks
10,Kayle
11,Master Yi

Во втором (top.csv) у меня есть пары чемпионов (первый и второй столбец) и количество выигранных ими матчей (третий столбец)

2,1,3
3,1,5
4,1,6
5,1,1
6,1,10
7,1,9
8,1,11
10,4,12
7,5,2
3,3,6

Мне нужно заменить номера второго файла соответствующими именами первого файла.

Я пытался использовать awk и сохранять имена в массиве, но это не сработало

lengthChampions=`cat champions.csv | wc -l`

for i in `seq 1 $length`; do
    name=`cat champions.csv | head -$i | tail -1 | awk -F',' '{print $2}'`

    champions[$i]=$name
done

for i in `seq 1 10`; do
    champion1=${champions[`cat top.csv | head -$i | tail -1 | awk -F',' '{print $1}'`]}
    champion2=${champions[`cat top.csv | head -$i | tail -1 | awk -F',' '{print $2}'`]}

    awk -F',' 'NR=='$i' {$1='$champion1'} {$2='$champion2'} {print $1","$2","$3}' top.csv > tmptop.csv && mv tmptop.csv top.csv
done

Я бы хотел решить эту проблему, возможно, с меньшим количеством кода, чем этот. Результат должен быть примерно таким (не фактический результат для моих файлов):

Ahri,Ashe,1502
Camille,Ezreal,892
Ekko,Dr. Mundo,777
Fizz,Caitlyn,650
Gnar,Ezreal,578
Fiora,Irelia,452
Janna,Graves,321
Jax,Jinx,245
Ashe,Corki,151
Katarina,Lee Sin,102

Ответы [ 2 ]

2 голосов
/ 14 апреля 2019

это может быть выполнено за один вызов awk.свяжите числа с чемпионами в массиве и используйте его для замены чисел во втором файле.

awk 'BEGIN{FS=OFS=","} NR==FNR{a[$1]=$2;next} {$1=a[$1];$2=a[$2]} 1' champions.csv top.csv 
Olaf,Annie,3
Galio,Annie,5
Twisted Fate,Annie,6
Xin Zhao,Annie,1
Urgot,Annie,10
LeBlanc,Annie,9
Vladimir,Annie,11
Kayle,Twisted Fate,12
LeBlanc,Xin Zhao,2
Galio,Galio,6

на случай, если в top.csv должно быть несколько чисел, которых нет в champions.csv, используйте следующеевместо этого, чтобы предотвратить удаление этих номеров:

awk 'BEGIN{FS=OFS=","} NR==FNR{a[$1]=$2;next} ($1 in a){$1=a[$1]} ($2 in a){$2=a[$2]} 1' champions.csv top.csv
0 голосов
/ 15 апреля 2019

Предполагая, что столбец 2nd champions.csv не слишком велик, ( т.е. больше, чем максимальный размер массива bash ${c[@]}), затем с использованием bash и cut:

readarray -t -O 1 c < <(cut -d, -f2 champions.csv)
while IFS=, read x y z; do 
    printf '%s,%s,%s\n' "${c[$x]}" "${c[$y]}" "$z" 
done < top.csv

Выход:

Olaf,Annie,3
Galio,Annie,5
Twisted Fate,Annie,6
Xin Zhao,Annie,1
Urgot,Annie,10
LeBlanc,Annie,9
Vladimir,Annie,11
Kayle,Twisted Fate,12
LeBlanc,Xin Zhao,2
Galio,Galio,6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...