2017-10-19 102 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