Shell

從查找字典生成錯誤建議

  • December 21, 2013

編輯:文件已更改為 tsv 以更好地處理文本欄位中的空格

我有以下形式的 2 個 csv 文件:

文件 1:availableText.csv(可以很大)

“id1”、“text1-1”

、“id1”、“text1-2”、

“id1”、“text1-3”、

“id1”、“text1-4”、

“id2”、“text2-1”

、“id2”、“ text2-2"

“id2” , “text2-3”

“id2” , “text2-4”

文件 2:errorText.csv

“id1”、“texta”、

“id2”、“textb”、

“id3”、“textc”

、“id4”、“textd”

……

對於 中的每一行wrongText.csv,我想過濾相同 id 的可用文本條目,並建議使用最佳可用選項tre-agrep(一個類似 grep 的函式,允許模式中出現錯誤並使用 -B 返回最佳匹配)

例如,對於id1

tre-agrep -B ’texta’ (來自 text1-1:4) | tr “\n” " $ " ( will produce something like ’text1-2 $ 文本1-4’)

所需的輸出文件將如下所示:

“id1”、“texta”、“text1-2” $ text1-4" “id2” , “textb” , “text2-1 $ 文本2-3$文本2-4”

筆記:

  1. CSV 可以轉換為任何格式,但文本可能包含空格(但不能包含特殊字元)
  2. ID 確實包含特殊字元和 utf-8
  3. 速度無關緊要(至少現在)

我將輸入文件更改為 tsv 並使用以下解決方案(靈感來自第一個答案)

echo "" > wrong_variables.tmp  
while read line  
do  
   var_template=`echo $line | cut -f2`  
   var_parameter=`echo $line | cut -f3`  

   #TODO order by template and cache grep output  
   grep "${var_template}" templ2.tmp  | cut -f2 > tmpfile  
   var_suggest=`tre-agrep -B "$var_parameter" tmpfile | tr "\n" "$"`  

   echo $line \\t $var_suggest >> wrong_variables.tmp
done < $OUTPUT_RAW

作為一個結果:

for pattern in $(awk '{print $3}' wrong.csv) ; do tre-agrep -B $pattern available.csv | tr "\n" "$"; echo ; done  
"id1" , "text1-1"$"id1" , "text1-2"$"id1" , "text1-3"$"id1" , "text1-4"$"id2" , "text2-1"$"id2" , "text2-2"$"id2" , "text2-3"$"id2" , "text2-4"$
"id1" , "text1-1"$"id1" , "text1-2"$"id1" , "text1-3"$"id1" , "text1-4"$"id2" , "text2-1"$"id2" , "text2-2"$"id2" , "text2-3"$"id2" , "text2-4"$
"id1" , "text1-1"$"id1" , "text1-2"$"id1" , "text1-3"$"id1" , "text1-4"$"id2" , "text2-1"$"id2" , "text2-2"$"id2" , "text2-3"$"id2" , "text2-4"$
"id1" , "text1-1"$"id1" , "text1-2"$"id1" , "text1-3"$"id1" , "text1-4"$"id2" , "text2-1"$"id2" , "text2-2"$"id2" , "text2-3"$"id2" , "text2-4"$

更好的可讀性:

for pattern in $(awk '{print $3}' wrong.csv) 
do
 tre-agrep -B $pattern available.csv | tr "\n" "$"
 echo
done  

類似的東西?

引用自:https://unix.stackexchange.com/questions/11258