Shell

如果一個文件中的列與另一個文件中的列部分匹配,則匹配,然後列印兩個文件中的列

  • August 25, 2022

我有 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 的第二個欄位、第二個、第三個和第四個欄位配置文件。

所需的輸出 -

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

/home/aks/sample/aks,288004,1,2,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 

引用自:https://unix.stackexchange.com/questions/714825