有一个棘手且复杂的程序,用于预处理文本,以便将其发送到机器学习软件。
长话短说:
bash 脚本进入一个文件夹,其中有数千个文本文件正在等待,用 CAT 打开它们,清理和删除多余的行,然后在将文件发送到机器学习过程之前将 CSV 写入磁盘,其中包含一些信息以供以后人工检查。
除了内容之外,保留行号也非常重要,因为单词出现的顺序是机器学习过程的关键。
因此,我的方法是以这种方式向每一行添加行号(一个内联包含许多管道命令):
for every file in *.txt
do
cat -v $file | nl -nrz -w4 -s$'\t' | .......
然后我用这种方式去掉不需要的线条(示例):
...... | sed '/^$/d'| grep -vEi 'unsettling|aforementioned|ruled'
最后保留两行以这种方式进一步处理:
........ | grep -A 1 -Ei 'university|institute|trust|college'
输出是这样的(采样两个文件):
file 1.txt
0098 university of Goteborg is downtown and is one of the
0099 most beautiful building you can visit
0123 the institute of Oslo for advanced investigation
0124 is near the central station and keeps
0234 most important college of Munich
0235 and the most acclaimed teachers are
file 2.txt
0023 there is no trust or confidence
0024 in the counselor to accomplish the new
0182 usually the college is visited
0183 every term for the president but
[编辑] 错过了这一步,这是在错误的行中。对不起。
然后,文本以这种方式堆叠成“段落”:
tr '\n\r' ' '| grep -Eio '.{0,0}university.{0,25}|.{0,0}college.{0,25}'
[编辑结束]
此输出保存为变量“CLEANED_TXT”并通过管道传输到 WHILE,如下所示:
while read everyline; do
if [[ -n "${everyline// }" ]];then
echo "$file;$linenumber;$everyline" >> output.csv
fi
done <<< "$CLEANED_TXT"
done # for every text file
最终期望的输出
file 1.txt;0098;university of Goteborg
file 1.txt;0123;the institute of Oslo
file 1.txt;0234;college of Munich
我的问题是行号丢失这是最后一步,因为 GREP 就在循环之前。考虑到我需要原始行号。不允许在循环内重新编号。
我被困住了。任何帮助将非常感激。
问候
答案1
更新2去掉整tr ... | grep
行(它只是弄乱了)并将其替换while
为:
while read linenumber everyline; do
everyline=$(echo $everyline | grep -Eio '.{0,0}university.{0,25}|.{0,0}college.{0,25}')
if [[ -n "$everyline" ]]; then
echo "$file;$linenumber;$everyline" >> output.csv
fi
done
它将填充$linenumber
正确的值,并在正确的位置匹配单词:
file1.txt;0098;university of Goteborg is downtown
file1.txt;0234;college of Munich
file1.txt;0182;college is visited
但请注意,整个事情一团糟,应该用perl
orawk
或类似的语言重写。