编辑:文件已更改为 tsv 以更好地处理文本字段中的空格
我有 2 个 csv 文件,格式如下:
文件 1:availableText.csv(可能很大)
“id1”、“text1-1”
、“id1”、“text1-2”、
“id1”、“text1-3”、
“id1”、“text1-4”
、“id2”、“text2-1”、
“id2”、“文本2-2”
“id2”,“文本2-3”
“id2”,“文本2-4”
...
文件 2:错误文本.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" "$"
(将产生类似 'text1-2$text1-4' 的内容)
所需的输出文件将如下所示:
“id1”、“texta”、“text1-2$text1-4”、
“id2”、“textb”、“text2-1$text2-3$text2-4”
笔记:
- CSV 可以转换为任何格式,但文本可以包含空格(但不能包含特殊字符)
- ID 确实包含特殊字符和 utf-8
- 速度并不重要(至少目前如此)
答案1
结果如下:
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
类似的事情?
答案2
我将输入文件更改为 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