Linux Shell:如果字符串中有相同的单词,则从文件中合并两个字符串

时间:2014-03-13 11:11:37

标签: linux sed awk

小问题,但对我来说很难。我有两个文件 文件A:

www.def.aBc.com
123.aaa.cOm
555.bbb.com.hk
www.fwe.wef.CcC.hk
www.abc.com
555.hjr.bbb.cOm.hk
www.ccc.hk
www.def.Abc.coM
123.aaa.COM
555.bbb.com.Hk
www.fwe.wef.cCc.hk
www.aBc.com
555.hjr.bbb.com.hK
www.ccc.hk

档案B:

aaa.com
abc.com
bbb.com.hk
ccc.hk

如果匹配单词的结尾,我尝试将文件B附加到文件A(不关心大小写)。 输出如下:

www.def.aBc.com  abc.com
123.aaa.cOm  aaa.com
555.bbb.com.hk  bbb.com.hk
www.fwe.wef.CcC.hk  ccc.hk
www.abc.com  abc.com
555.hjr.bbb.cOm.hk  bbb.com.hk
www.ccc.hk  ccc.hk
www.def.Abc.coM  abc.com
123.aaa.COM  aaa.com
555.bbb.com.Hk  bbb.com.hk
www.fwe.wef.cCc.hk  ccc.hk
www.aBc.com  abc.com
555.hjr.bbb.com.hK  bbb.com.hk
www.ccc.hk  ccc.hk

4 个答案:

答案 0 :(得分:2)

您也可以使用sed

for line in `cat file_b`; 
do 
  sed -i -r "s/(^.*$line$)/\1 $line/Ig" file_a; 
done

答案 1 :(得分:1)

尝试使用此脚本将融合结果存储在文件fusion_result中:

if [[ -e fusion_result ]]
then
    rm fusion_result
fi

for linea in `cat A`
    do
    compare=`echo $linea | tr [:upper:] [:lower:]` # Case insensitive
    for lineb in `cat B`
        do
        if [[ $compare =~ $lineb ]] # Regex comparison
            then
            echo $linea $lineb >> fusion_result
        fi
    done
done

如果b中的行是多余的(即您有aaa.com和aaa.com.hk),请将if语句中的$lineb更改为$lineb$

答案 2 :(得分:1)

使用awk

awk 'NR==FNR{a[$1]++;next}{for(x in a){if(index(tolower($0),x)>0)print $0,x}}' fileb filea

$ awk 'NR==FNR{a[$1]++;next}{for(x in a){if(index(tolower($0),x)>0)print $0,x}}' fb fa
www.def.aBc.com abc.com
123.aaa.cOm aaa.com
555.bbb.com.hk bbb.com.hk
www.fwe.wef.CcC.hk ccc.hk
www.abc.com abc.com
555.hjr.bbb.cOm.hk bbb.com.hk
www.ccc.hk ccc.hk
www.def.Abc.coM abc.com
123.aaa.COM aaa.com
555.bbb.com.Hk bbb.com.hk
www.fwe.wef.cCc.hk ccc.hk
www.aBc.com abc.com
555.hjr.bbb.com.hK bbb.com.hk
www.ccc.hk ccc.hk

答案 3 :(得分:1)

使用awk

awk 'BEGIN{IGNORECASE=1}NR==FNR{a[$1];next}{for (i in a) if ($1~i) print $0,i}' fileB fileA

解释

  • IGNORECASE=1不区分大小写