Shell
從查找字典生成錯誤建議
編輯:文件已更改為 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”
筆記:
- CSV 可以轉換為任何格式,但文本可能包含空格(但不能包含特殊字元)
- ID 確實包含特殊字元和 utf-8
- 速度無關緊要(至少現在)
我將輸入文件更改為 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
類似的東西?