首页 > 解决方案 > 用文件中的单词替换数字的问题

问题描述

我有两个文件:

在第一个(champions.csv)中,我有一些英雄联盟冠军的号码和名字

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

标签: shellawksed

解决方案


这可以在单个 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

推荐阅读