0

我有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
4

3 回答 3

0

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

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
于 2013-07-22T10:51:47.403 回答
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
于 2013-07-22T12:51:17.867 回答
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 为零,则打印单词本身。否则打印该单词的所有匹配项的第二列。

于 2013-07-22T11:09:46.003 回答