편집: 텍스트 필드의 공백을 더 잘 처리하기 위해 파일이 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
(패턴의 오류를 허용하고 -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"
노트:
- 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