우분투 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개 문자입니다. 이 하위 문자열이 동일한 경우 두 줄의 전체 길이를 비교하고 두 줄의 더 긴 경로가 더 긴 경로의 길이와 연결된 출력 파일에 인쇄되어야 합니다.
위의 예에서는 다음과 같습니다.
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