編集:テキストフィールドのスペースをよりよく処理するために、ファイルがtsvに変更されました。
次の形式のcsvファイルが2つあります。
ファイル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:エラーtext.csv
「id1」、「texta」、
「id2」、「textb」、
「id3」、「textc」、
「id4」、「textd」
...
の各行に対してwrongText.csv
同じIDに対して利用可能なテキスト項目をフィルタリングし、利用可能な最も適切なオプションを提案するtre-agrep
関数使いたいです。
たとえば、次のようになります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