在 grep 中处理文本时保留行号

在 grep 中处理文本时保留行号

有一个棘手且复杂的程序,用于预处理文本,以便将其发送到机器学习软件。

长话短说:

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

但请注意,整个事情一团糟,应该用perlorawk或类似的语言重写。

相关内容