2017-08-14 34 views
0

我有一個記錄列表如下如何獲得驗證與組數由數據在UNIX

來源:

a,yes 
a,yes 
b,No 
c,N/A 
c,N/A 
c,N/A 
d,xyz 
d,abc 
d,abc 

輸出:

a, Yes 2 
b, No 1 
c, N/A 3 
d, xyz 1 
d, abc 2 

c, N/A "File is not correct" 

這裏是'和'否'是可接受的單詞,如果任何其他單詞數大於單個$ 1值的'是'或'否'字數,則我們發出類似「文件不好」的說法

我曾嘗試下面的腳本

awk -F, '{a[$1]++;}END{for (i in a)print i, a[i];}' filetest.txt 
+0

您有問題要問?此外,你有什麼嘗試,什麼不工作,你嘗試了什麼? –

+0

到目前爲止,你有什麼嘗試? – sjsam

+0

'awk -F,'{a [$ 1] ++;} END {for(i in a print i,a [i];}'filetest.txt'我試過 – Bobby

回答

-2
#!/bin/sh 

FILE=1.txt 

for r in `cat $FILE | sort | uniq`; do 
count=`grep "$r" "$FILE" | wc -l | sed -e 's/^ *//'` 
echo "$r $count"; 
done 
1

如果您不擔心輸出序列(同INPUT_FILE),那麼下面可以幫助你在相同的。

awk -F, '{array[$1", "$2]++;} /yes/{y++;next} /No/{n++;next} /N\/A/{count++;next} END{;for(i in array){printf("%s %s%s\n",i,array[i],(count>y && count>n) && i ~ /N\/A/?RS i" File is not correct":"")}}' Input_file 

編輯:添加的解非一個襯片的形式現在也。

awk -F, '{ 
array[$1", "$2]++; 
} 
/yes/{ 
    y++; 
    next 
} 
/No/{ 
    n++; 
    next 
} 
/N\/A/{ 
    count++; 
    next 
} 
END{; 
    for(i in array){ 
    printf("%s %s%s\n",i,array[i],(count>y && count>n) && i ~ /N\/A/?RS i" File is not correct":"") 
} 
}' Input_file 

EDIT2:每OP N/A作爲不應被硬編碼,然後下面的代碼將檢查串是計數,串的計數沒有和所述第二場的其餘部分的計數。然後它會將休息計數與yes和no進行比較,根據OP的要求打印行數。

awk -F, '{ 
array[$1", "$2]++; 
} 
/yes/{ 
    y++; 
    next 
} 
/No/{ 
    n++; 
    next 
} 
{ 
    count[$2]++; 
} 
END{ 
    for(i in count){ 
    val=val>count[i]?val:count[i] 
}; 
    for(i in array){ 
    printf("%s %s%s\n",i,array[i],(val>y && val>n) &&(i !~ /yes/ && i !~ /No/)?RS i" File is not correct":"") 
} 
}' Input_file 

運行上面的代碼後,我越來越關注。

./script.ksh 
d, xyz 1 
d, xyz File is not correct 
c, N/A 3 
c, N/A File is not correct 
b, No 1 
a, yes 2 
d, abc 2 
d, abc File is not correct 
+1

我應該專注於'是'和'不'數,如果有其他數值大於Yes和No count,那麼我們應該報告(總是是且沒有數值應該只是更好的文件) – Bobby

+0

現在嘗試編輯一個並讓我知道這是否有助於你。 – RavinderSingh13

+1

我們可以硬編碼是和不是,但沒有任何其他值。我們可以通過1美元和2美元的專欄來計算最高點數,如果最高點數2美元不是是或否,那麼我們必須報告 – Bobby

0

隨着GNU AWK真正的多維數組:

$ cat tst.awk 
BEGIN { FS=","; OFS=", " } 
{ cnt[$1][$2]++ } 
END { 
    for (key in cnt) { 
     for (val in cnt[key]) { 
      cur = cnt[key][val] 
      print key, val " " cur 
      if (tolower(val) ~ /^(yes|no)$/) { 
       maxGood = (maxGood > cur ? maxGood : cur) 
      } 
      else { 
       badCnt[key][val] = cur 
      } 
     } 
    } 

    print "" 
    for (key in badCnt) { 
     for (val in badCnt[key]) { 
      if (badCnt[key][val] > maxGood) { 
       print key, val " File is not correct" 
      } 
     } 
    } 
} 

$ awk -f tst.awk file 
a, yes 2 
b, No 1 
c, N/A 3 
d, abc 2 
d, xyz 1 

c, N/A File is not correct 

用在其他地方tolower()或刪除其適當的,如果你的$ 2個數據真的可以大寫或小寫,或者這只是一個在你的例子中的錯誤,並取決於如果你想這被視爲一個錯誤或不。

輸出將以in運營商的隨機順序提供 - 如果您在意,可輕鬆更改爲其他任何訂單。