2016-04-18 27 views
1

我正在驗證管道分隔文件中的幾列。我的第二列默認爲'*'。通過bash格式化星號

E.g.要驗證的文件數據:

abc|* |123 
def|** |456 
ghi|* |789 

由於數據錯誤,第2條記錄有2顆星。

我teied它:

Value_to_match="*" 
unmatch_count=cat <filename>| cut -d'|' -f2 | awk '{$1=$1};1' | grep -vw "$Value_to_match" | sort -n | uniq | wc -l 
echo "unmatch_count" 

這給了我算作0,而我期待1(爲**),因爲我已經使用-w使用grep是精確匹配和-v這是反轉的比賽。如何可以grep **

+0

另外,請注意'unmatch_count = cat | ......不會工作。如果要將命令的輸出存儲在變量中,請說'var = $(command)'。 – fedorqui

+1

把貓''剪切'''剪切'到'awk'和'awk'到'grep'管道只是瘋狂。 'awk -F'\ t'-vx =「$ Value_to_match」'$ 2!= x {a [$ 2] ++} END {for(s in a)printf(「%8d%s \ n」,a [s ],s}'文件名'(猜一點你在想什麼) – tripleee

+1

沒有人在大學裏教shell腳本嗎?好悲痛... –

回答

1

這裏的問題是grep考慮**的正則表達式。爲了防止這種情況,使用-F使用固定的字符串:

grep -F '**' file 

但是,你有一個不必要的大集管道業務,而單獨awk能應付得很好。

如果您要檢查在第二列中包含**線,說:

$ awk -F"|" '$2 ~ /\*\*/' file 
def|** |456 

如果你要計算你有多少這樣的線,說:

$ awk -F"|" '$2 ~ /\*\*/ {sum++} END {print sum}' file 
1 

注意使用awk

  • -F"|"設置字段分隔符到|
  • $2 ~ /\*\*/要說:嘿,在每一行檢查第二個字段是否包含兩個星號(請記住我們通過|切片行)。我們正在逃避*,因爲它具有作爲正則表達式的特殊含義。

如果你想輸出的那些只有一個星號作爲第二場線,說:

$ awk -F"|" '$2 ~ /^*\s*$/' file 
abc|* |123 
ghi|* |789 

或者檢查那些不匹配這個表達式與!~

$ awk -F"|" '$2 !~ /^*\s*$/' a 
def|** |456 
+0

我想只搜索我的'Value_to_match'但是如果我得到任何錯誤的數據,就像在這種情況下我得到'**',它也可以是'***'或其他值,我的'Value_to_match'變量應該能夠捕獲它。代碼對於其他值(例如字母數字值或單個數字特殊字符)工作正常,但代碼未能驗證'**'方案。 – Ishan

+0

@Ishan你的問題不清楚。編輯它,描述你想要的和你需要的輸出。然後,我會再檢查一次。 – fedorqui

+0

我只需要找出錯誤的數據。我這種情況下,它應該給我輸出爲1然而它給了我0 – Ishan