单个文本文件:比较每行和下一行的前 n 个字符。如果它们相等,则在输出文件中打印两者中较长的一个

单个文本文件:比较每行和下一行的前 n 个字符。如果它们相等,则在输出文件中打印两者中较长的一个

我正在使用 Ubuntu bash。我的文件包含文件系统的路径。

例如

C:\users\username\subfolder\thisismyfile.txt
C:\users\username\subfolder\thisismyfileplusadate.txt
C:\users\username\subfolder2\thisismyfileplusname.txt
C:\users\username\subfolder3\thisismyfile.txt

我想做的事:

将每行的每个开头与下一行的开头进行比较。

例如

第 1 行的前 n 个字符,下一行的前 n 个字符。如果这个子字符串相同,我想比较两行的完整长度,并且两行的较长路径应打印到与该较长路径的长度连接的输出文件中。

所以对于我上面的例子:

C:\users\username\subfolder\thisismyfile.txt
C:\users\username\subfolder\thisismyfileplusadate.txt

前 n 个字符,假设为 28,因此将比较“C:\users\username\subfolder\”。它们是相同的。接下来我想比较线条的长度。第 1 行有 44 个字符,第 2 行有 53 个字符。

所以我想将第 1 行打印到输出文件并将“length: 53”连接到字符串(或行的开头)

我该怎么办呢?

答案1

#!/bin/bash 

file_len=$(wc -l afile.txt | awk {'print $1'});
let "flen = $file_len-1";
nth=28;
for i in $(seq 1 $flen); do {
        li_cut="";
        ly_cut="";
        let "y = $i +1";
        line_i=$(sed -n "$i"p afile.txt);
        len_i=$(echo $line_i | wc -m)
        li_cut="${line_i:0:$nth}";
        line_y=$(sed -n "$y"p afile.txt);
        len_y=$(echo $line_y | wc -m)
        ly_cut="${line_y:0:$nth}";

        if [ "$li_cut" == "$ly_cut" ]; then {
                if [ $len_i -gt  $len_y ]; then {
                        echo "$line_i [ $len_i ];"
                } fi
                if [ $len_y -ge $len_i ]; then  {
                        echo "$line_y [ $len_y ]";
                } fi;
        } fi;
} done

像这样的东西?对于巨大的文本来说不会那么好,并且可能会以一些更漂亮的形式进行编码。

编辑:最后使用 sort|uniq 可能会很有用,因为:如果第 n+1 > n 行且第 n+1 > n+2 行,你将得到一个“重复”的 n+1

答案2

要沿着该路径的长度打印较长路径的内容:

awk -v n=28 '
  substr($0,1,n) == substr(last,1,n) {
    if(length($0) > length(last))
      printf("length: %d %s\n", length($0), $0);
    else
      printf("length: %d %s\n", length(last), last);
  }
  {last = $0}
' file
length: 53 C:\users\username\subfolder\thisismyfileplusadate.txt

相关内容