2017-10-19 104 views
0

文件的某些领域就像一个逗号分隔的文件:如何使用bash脚本来掩盖csv文件

hue,1,123456,wow,hai 
    heu,2,654321,waw,hey 
    uhe,3,001100,iwi,hel 
    euh,4,119988,qaq,hal 

,我们希望用我们自己的方式来掩盖第三列:

0->9 
1->8 
2->7 
3->6 
4->5 
5->4 
6->3 
7->2 
8->1 
9->0 

于是脚本后,我们应该得到的东西,如:下列

hue,1,876543,wow,hai 
    heu,2,345678,waw,hey 
    uhe,3,998899,iwi,hel 
    euh,4,880011,qaq,hal 
+0

@Inian是的,我们可以做到这一点 – BeyondTryingToCode

回答

0

尝试,让我知道,如果这有助于你(在GNU AWK创建)。

awk -F, 'function change(field){num=split(field, array,"");for(i=1;i<=num;i++){gsub(/.*/,9-array[i],array[i]);new=new?new array[i]:array[i]};$3=new;new=""} change($3) 1' Input_file 

输出如下。

hue 1 876543 wow hai 
heu 2 345678 waw hey 
uhe 3 998899 iwi hel 
euh 4 880011 qaq hal 

编辑:一个通用的解决方案,你可以改变值内BEGIN命名的数组阵列的结构,并可以利用任何你想要替换的,你可以更多的值要替换过在里面。

awk -F, ' 
BEGIN{ 
    num=split("0-9,1-8,2-7,3-6,4-5,5-4,6-3,7-2,8-1,9-0",array,","); 
    for(i=1;i<=num;i++){ 
    split(array[i],array1,"-"); 
    value[array1[1]]=array1[2] 
} 
} 
function change(field){ 
    num=split(field, a,""); 
    for(i=1;i<=num;i++){ 
    new=new?(a[i] in value?new value[a[i]]:new a[i]):(a[i] in value?value[a[i]]:a[i]) 
}; 
    $3=new; 
    new="" 
} 
change($3) 
1 
' OFS=, Input_file 
+0

你的脚本是好的。虽然我要求的是我可以定制该方法的脚本。所以你的脚本只适用于数量减少1的情况。但是,如果我想要类似 0-2 1-4 2-6 .... 它不会工作肯定。 – BeyondTryingToCode

+0

@BeyondTryingToCode,请现在检查我的编辑解决方案,让我知道如果这有助于你,那么你可以添加/编辑任何你想替代的值,让我知道。 – RavinderSingh13