用file2中找到的相应值替换file1的内容

时间:2013-07-22 10:19:47

标签: shell unix

我有2个txt文件

档案1

vol12     
abc_xyz     
vmfs_unix
vol5
vol4
titan6lr_blr

文件2

vol12 ,cs_rvl      
vol12 ,cvs_rvl     
vol12 ,svn_rvl     
vol12 ,swarch      
abc_xyz ,abc_xyz 
def6g ,def6g  
vmfs_unix ,vmfs_unix
vol5 ,images
vol4 ,svn_blr
vol4 ,home4

我需要将文件1的vol12,vol5,vol4替换为文件2第2列中的相应值 输出应为:

cs_rvl      
cvs_rvl     
svn_rvl     
swarch 
abc_xyz     
vmfs_unix
images
svn_blr
home4
titan6lr_blr

3 个答案:

答案 0 :(得分:0)

使用循环读取file1并从file2中输出新值,如下所示:

while read line
do
    if [[ $line =~ ^(vol12|vol5|vol4) ]]
    then
        grep "$line" file2 | cut -d, -f2
    else
        echo "$line"
    fi
done < file1

输出:

cs_rvl
cvs_rvl
svn_rvl
swarch
abc_xyz
vmfs_unix
images
svn_blr
home4
titan6lr_blr

答案 1 :(得分:0)

这是另一个版本:

#!/bin/bash

 arr=$(grep -v "^$" $1)
 echo -n "" > $1
 for match in ${arr}
 {
    i=$(grep ^$i -c $2)
    if [ $i -eq 0 ]
    then
            echo $match >> $1
    else
            grep ^$match $2 | cut -d "," -f2  >> $1
    fi
}

运行脚本以在file1中获取结果,如下所示:

./script.sh file1 file2

简要说明: 遍历file1的每一个非空行。每一行都是一个单词(根据问题)。然后对file2中的每个单词进行计数。如果count为零,则打印单词本身。否则,打印该单词的所有匹配的第二列。

答案 2 :(得分:0)

您可以使用纯awk解决方案:

awk -F"[, ]+" '$1 ~ /^vol/ && NR==FNR { 
   if ($1 in a)
      a[$1]=a[$1] ORS $2;
   else
      a[$1]=$2;
   next
}
NR>FNR && ($1 in a) {
   print a[$1]
}
NR>FNR && !($1 in a) { 
   print $1
}' file2 file1