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