단일 텍스트 파일: 각 줄을 다음 줄의 처음 n개 문자와 비교합니다. 동일하면 출력 파일에서 둘 중 더 긴 것을 인쇄합니다.

단일 텍스트 파일: 각 줄을 다음 줄의 처음 n개 문자와 비교합니다. 동일하면 출력 파일에서 둘 중 더 긴 것을 인쇄합니다.

우분투 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

관련 정보