編集:テキストフィールドのスペースをより適切に処理するために、ファイルがtsvに変更されました
次の形式の2つの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"
.。
"id1"、 "texta"
"id2"、 "textb"
"id3"、 "textc"
"id4"、 "texted"
.。
wrongText.csv
のすべての行について、同じIDの使用可能なテキストエントリをフィルタリングし、tre-agrep
(パターンのエラーを許可し、-Bを使用するgrepのような関数)を使用して使用可能な最適なオプションを提案します。最適な一致を返します)
たとえば、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"
注意:
入力ファイルを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
そんな感じ?