用文件中的单词替换数字时出现问题

时间:2019-04-14 13:51:34

标签: shell awk sed

我有两个文件:

在第一个(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 个答案:

答案 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