単一テキストファイル:各行を次の行の最初の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

私がしたいこと:

各行の先頭と次の行の先頭を比較します。

例えば

最初の行の最初のn文字と次の行の最初のn文字。この部分文字列が同じ場合は、2行の全長を比較し、2行の長いパスを長いパスの長さに関連付けられている出力ファイルに印刷する必要があります。

上記の例では、次のようになります。

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 の「重複」が得られます。

おすすめ記事