한 파일의 열이 다른 파일의 열과 부분적으로 일치하는 경우 일치시킨 다음 두 파일의 열을 인쇄합니다.

한 파일의 열이 다른 파일의 열과 부분적으로 일치하는 경우 일치시킨 다음 두 파일의 열을 인쇄합니다.

필드가 쉼표로 구분된 파일이 2개 있습니다.

aks@dev1:~$ cat dir.txt

/home/aks/cleanup,512

/home/aks/git,208

/home/aks/github,424


/home/aks/predirsize,216

/home/aks/sample,288004
aks@dev1:~$ cat config.txt

/home/aks/cleanup,1,7,2

/home/aks/sample/aks,1,2,1

/home/vbht/test_bkup,1,7,None

config.txt의 첫 번째 필드에서 dir.txt의 첫 번째 필드를 찾아야 하며 완전히 또는 부분적으로 일치하면 config.txt의 첫 번째 필드, dir.txt의 두 번째 필드, dir 두 번째, 세 번째, .txt의 네 번째 필드는 .txt를 구성합니다.

예상 출력 -

/home/aks/cleanup,512,1,7,2

/home/aks/sample/aks,288004,1,2,1

답변1

방법 은 다음과 같습니다 awk.

$ awk -F, -v OFS=, '{ if(/^$/){next} if(NR==FNR){f1[$1]=$2;} else{for(path in f1){ if($1 ~ path ){print $1,f1[path],$2,$3,$4}}}}' dir.txt config.txt 
/home/aks/cleanup,512,1,7,2
/home/aks/sample/aks,288004,1,2,1

이것은 여러 줄로 나누어 설명하는 것과 같습니다. 이 내용을 터미널에 직접 복사하여 붙여넣을 수 있습니다.

awk -F, -v OFS=, '
 { 
    ## Skip empty lines
    if(/^$/){ next } 

    ## If this is the first file, store the first field 
    ## as a key and the second field as its value in the 
    ##associative array f1 
    if(NR==FNR){ f1[$1]=$2 } 

    ## If this is the second file
    else{
        ## for each of the keys in f1, the paths
        for(path in f1){ 
            ## If the 1st field of this line matches a path
            if($1 ~ path){
                ## print all the things
                print $1,f1[path],$2,$3,$4
            }
        }
    }
 }' dir.txt config.txt 

관련 정보