我有两个文件:
在第一个(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
答案 0 :(得分:2)
这可以在单个awk调用中完成。将数字与数组中的冠军联系起来,并用它来替换第二个文件中的数字。
for (int i = 0; i < treeView1.Nodes.Count; i++)
{
for (int j = 0; j < treeView1.Nodes[i].Nodes.Count; j++)
{
foreach (var item in myDictionaryReconstructed)
{
if ("TreeNode: " + item.Key == treeView1.Nodes[i].Nodes[j].ToString())
{
treeView1.Nodes[i].Nodes[j].Nodes.Add(item.Value);
treeView1.ExpandAll();
}
}
}
}
如果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
答案 1 :(得分:0)
假设 champions.csv 的 2nd 列不太大,( ie 大于{{ 1}}数组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