shell - 用文件中的单词替换数字的问题
问题描述
我有两个文件:
在第一个(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
解决方案
这可以在单个 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
推荐阅读
- javascript - 如何对数组中指向其他对象的对象进行分组
- woocommerce - Woocommerce 出口母产品
- c# - 使用 Stylet 配置后如何访问我的 DatabaseContext
- php - 如何让我的 Wordpress 插件接收数据并在 ajax/php 请求中将其中继到需要身份验证的远程服务器?
- android - 是什么导致TextView垂直移位
- mysql - 为什么EXPLAIN和Slow query的结果差别很大?
- firebase - 如何使用 firebase 从 React Native 应用程序接收邮件?
- javascript - 单击时停止关闭对话框
- javascript - 如何发送函数(数据)的值而不是将其发送到 $(“#timer”)?
- imacros - 循环一段特定的代码(我不知道我在做什么)