2017-09-23 80 views
0

希望打印以遞增計數,然後打印第1列中的唯一值的計數第2列&第3列...列NF和列$ 0 和如果單詞僅出現在第1列的一次,則想要將備註打印爲「否」作爲重複標記 ,並且如果該單詞出現多於第1列的一次,則打算將重複打印爲「是」的備註標誌awk打印每列中唯一值出現的增量計數

看起來像這樣

awk -F"," '{OFS=","; if (word == $1) { counter++ } else { counter = 1; word = $1 }; print $0 ",", "Yes/No", counter }' 

例如,我試圖檢查字段$ 1(水果名稱)中是否有任何重複的信息。 在Name字段下,「Apple」出現三次,「Orange」出現兩次,「Mango」出現一次。 因此,如果任何單詞不重複超過一次consieder爲「Name_Dup =否」重複和出現的計數是「Name_Counter = 1」(即芒果)

其中「Apple」出現3次,所以它是當出現第一次計數時,重複/重複的標記爲「是」,其爲「Name_Dup =是」且Name_Counter = 1「, 當它第二次出現時」Name_Dup =是「 = Yes」和Name_Counter = 3

然後需要檢查每個列$ 2,$ 3 ...直到$ NF與$ 0 ..

我的實際輸入文件沒有排序的任意順序,沒有以前是場像10個字段一樣變化, 12個字段和15個字段等

Input.csv

Name,Amount,Dept 
Apple,10,eee 
Orange,20,csc 
Apple,30,mec 
Mango,40,sss 
Apple,10,eee 
Orange,10,csc 

所需的輸出

Name,Amount,Dept,Name_Dup,Name_Counter,Amount_Dup,Amount_Counter,Dept_Dup,Dept_Counter,EntireLine_Dup,EntireLine_Counter 
Apple,10,eee,Yes,1,Yes,1,Yes,1,Yes,1 
Orange,20,csc,Yes,1,No,1,Yes,1,No,1 
Apple,30,mec,Yes,2,No,1,No,1,No,1 
Mango,40,sss,No,1,No,1,No,1,No,1 
Apple,10,eee,Yes,3,Yes,2,Yes,2,Yes,2 
Orange,10,csc,Yes,2,Yes,3,Yes,2,No,1 

例如,請參考以下參考步驟。

步驟#1 - 1場$檢查和輸出

Name,Name_Dup,Name_Counter 
Apple,Yes,1 
Orange,Yes,1 
Apple,Yes,2 
Mango,No,1 
Apple,Yes,3 
Orange,Yes,2 

步驟#2 - 字段$ 2個校驗和輸出

Amount,Amount_Dup,Amount_Counter 
10,Yes,1 
20,No,1 
30,No,1 
40,No,1 
10,Yes,2 
10,Yes,3 

步驟#3 - 字段$ 3檢查和輸出

Dept,Dept_Dup,Dept_Counter 
eee,Yes,1 
csc,Yes,1 
mec,No,1 
sss,No,1 
eee,Yes,2 
csc,Yes,2 

步驟#4場$ 0檢查,$ 1 & $ 2 & $ 3人組合和輸出

"Name,Amount,Dept",EntireLine_Dup,EntireLine_Counter 
"Apple,10,eee",Yes,1 
"Orange,20,csc",No,1 
"Apple,30,mec",No,1 
"Mango,40,sss",No,1 
"Apple,10,eee",Yes,2 
"Orange,10,csc",No,1 
+0

一點也不清楚,能否請您添加關於您的預期輸出的更多解釋,因爲在Input_file中,即使他們的計數超過1,字段也很少有NO。 – RavinderSingh13

+0

RavinderSingh13,我已經添加了步驟#1到步驟#4,請檢查並讓我們知道您是否需要任何其他詳細信息 – VNA

+0

對不起,說但不清楚,我們可以有條件,當你需要的時候,當你需要1等等請等這裏呢? – RavinderSingh13

回答

1

AWK解決方案:

OP請求,按照我的理解,每行顯示,每列,如果列值顯示一次以上,並給這個特定列的出現次數爲止。

$ cat tst.awk 
BEGIN{ FS=OFS="," } 
NR==1{ 
    header=$0 
    n=split("Dup,Counter",h) 
    for (i=1; i<=NF; i++) 
     for (j=1; j<=n; j++) header=header OFS $i"_"h[j] 
    printf("%s,EntireLine_Dup,EntireLine_Counter\n", header) 
    next 
} 
{ 
    r[++lines]=$0 
    for (col=1; col<=NF; col++) v[col][$col]++ 
    v[col][$0]++ 
} 
END { 
    for (l=1; l<=lines; l++){ 
     n=split(r[l], s) 
     res="" 
     for (c=1; c<=n; c++) 
     res=res OFS output(v,c,s[c]) 
     res=res OFS output(v,c,r[l]) 
     print r[l] res 
    } 
} 
function output(arr, col, val){ 
    return sprintf("%s,%s", (arr[col][val] > 1? "Yes" : "No"), ++count[col][val]) 
} 

與輸入:

$ cat input.txt 
Name,Amount,Dept,Nonsense 
Apple,10,eee,eee 
Orange,20,csc,eee 
Apple,30,mec,eee 
Mango,40,sss,eee 
Apple,10,eee,eee 
Orange,10,csc,eee 

這給了(我手動刪除標題行,因爲我無法得到它適合的代碼示例中):

$ awk -f tst.awk input.txt 
# deleted header line 
Apple,10,eee,eee,Yes,1,Yes,1,Yes,1,Yes,1,Yes,1 
Orange,20,csc,eee,Yes,1,No,1,Yes,1,Yes,2,No,1 
Apple,30,mec,eee,Yes,2,No,1,No,1,Yes,3,No,1 
Mango,40,sss,eee,No,1,No,1,No,1,Yes,4,No,1 
Apple,10,eee,eee,Yes,3,Yes,2,Yes,2,Yes,5,Yes,2 
Orange,10,csc,eee,Yes,2,Yes,3,Yes,2,Yes,6,No,1 
+0

Marc Lambrichs,哇,優秀的代碼,感謝大家的支持,並投票贊成! – VNA

0

你不提供你放在什麼樣的努力至今。這裏有一個提示,我會開始。我想,因爲awk是使用的工具,所以從shell命令開始排序Input.csv並將其傳遞給awk。在讀取輸入時填充數組,以及索引第一個字段的關聯數組。 END END部分遍歷數組,查看是否多次找到第一個字段。這需要一點時間,但這聽起來像一個家庭作業。不是生產問題。

+0

恕我直言,這將是更適合評論部分,而不是一個答案。 – RavinderSingh13

+0

Krassi Em,在實時情況下,我們正在從我們的供應商那裏得到諸如國家明智,區域明智,產品明智,產品代碼明智,費率信息和AZ目的地的報價 因此,在國家一級,區域一級,產品水平等等,因此我們無法決定哪些重複行需要刪除,發佈上述人口的期望輸出,我們可以檢查並迅速做出決定。 – VNA