首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据bash中的前三列连接两个变量

根据bash中的前三列连接两个变量
EN

Stack Overflow用户
提问于 2017-04-26 06:37:01
回答 3查看 107关注 0票数 1

我需要根据前三列的值连接两个变量,我尝试过this Question,但是我无法找到解决方案,因为我无法理解解决方案是如何实现的,所以不能用新的数据集来调整解决方案。

代码语言:javascript
复制
x='AA   N-1 0   OPEN    WORKING REACHABLE
AA  N-1 0   OPEN    WORKING REACHABLE
AA  N-1 0   OPEN    WORKING REACHABLE
BB  N-1 0   OPEN    WORKING REACHABLE
BB  N-1 0   OPEN    WORKING REACHABLE
CC  N-1 0   OPEN    WORKING REACHABLE
DD  N-1 0   OPEN    WORKING REACHABLE'


y='AA   N-1 0   XYZ-0   PINGABLE
AA  N-1 0   XYZ-1   PINGABLE
AA  N-1 0   XYZ-2   PINGABLE
CC  N-1 0   IJK-0   NOT-PINGABLE'

我试过这个:

代码语言:javascript
复制
awk 'NR==FNR{a[$1,$3]=$4; next}{$7="NA";if(($1,$3) in a){$7=a[$1,$3]} print}' <(echo "$x"|sort)  <(echo "$y"|sort)

代码语言:javascript
复制
   echo "$x" |while read name node location lastThree;
    do
        siLastTwo=$(echo "$y" |awk '{print $4,$5}')
        echo "$y"|awk '{NF=3}1' |grep -q  "$name $node $location" ;
            if [ $? -eq 0 ];then
                echo "$name $node $location $lastThree $siLastTwo"
            else
                echo "$name $node $location NA NA"
            fi
    done |awk 'NF==8'|column -t

我需要实现这样的目标:

代码语言:javascript
复制
AA  N-1 0   OPEN    WORKING REACHABLE   XYZ-0   PINGABLE
AA  N-1 0   OPEN    WORKING REACHABLE   XYZ-1   PINGABLE
AA  N-1 0   OPEN    WORKING REACHABLE   XYZ-2   PINGABLE
BB  N-1 0   OPEN    WORKING REACHABLE   NA      NA
BB  N-1 0   OPEN    WORKING REACHABLE   NA      NA
CC  N-1 0   OPEN    WORKING REACHABLE   IJK-0   NOT-PINGABLE    
DD  N-1 0   OPEN    WORKING REACHABLE   NA      NA

谦虚的要求:请帮助我,不只是在解决问题,用一些解释,因为我知道我不应该一直问类似的问题。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-26 08:10:40

一开始,请原谅我的这段代码。我认为它很难看,但它是工作(除了NA列,但我希望您得到的想法,以尽快修复它)。

代码语言:javascript
复制
echo "${x}" | while read line; do
col1="$(echo "${line}" | awk '{print $1}')"
col2="$(echo "${line}" | awk '{print $2}')"
col3="$(echo "${line}" | awk '{print $3}')"
#echo "col1: ${col1}, col2: ${col2}, col3: ${col3}"
#echo "===show matched for line: '${line}'====="
matcher="$(echo "${y}" | awk -v col1="${col1}" -v col2="${col2}" -v col3="${col3}" '($1 == col1) && ($2 == col2) && ($3 == col3) {$1=$2=$3=""; print}')"
#echo "${matcher}"
if [ -n "${matcher}" ]; then
    echo "${matcher}" | while read mtch; do
        res="${line}${mtch}"
        echo ${res}
    done
else
    echo ${line}
fi
done
票数 1
EN

Stack Overflow用户

发布于 2017-04-26 08:43:04

使用regex迭代所有行并进行匹配

代码语言:javascript
复制
x=('AA   N-1 0   OPEN    WORKING REACHABLE'
'AA  N-1 0   OPEN    WORKING REACHABLE'
'AA  N-1 0   OPEN    WORKING REACHABLE'
'BB  N-1 0   OPEN    WORKING REACHABLE'
'BB  N-1 0   OPEN    WORKING REACHABLE'
'CC  N-1 0   OPEN    WORKING REACHABLE'
'DD  N-1 0   OPEN    WORKING REACHABLE')


y=('AA   N-1 0   XYZ-0   PINGABLE'
'AA  N-1 0   XYZ-1   PINGABLE'
'AA  N-1 0   XYZ-2   PINGABLE'
'CC  N-1 0   IJK-0   NOT-PINGABLE')

filter='(\w{2}\s+\S{3}\s+\w)\s+(.*)'

if [ ! -z output.log ]; then
    rm output.log
fi

touch output.log

for ((i = 0; i < ${#x[@]}; i++)) do
    x_a=${x[$i]}

    y_matched=0

    for ((j = 0 ; j < ${#y[@]}; j++ )) do
        y_a=${y[$j]}

        if [[ $x_a =~ $filter ]]; then
            x_prefix=${BASH_REMATCH[1]}
            x_suffix=${BASH_REMATCH[2]}

            if [[ $y_a =~ $filter ]]; then

                y_prefix=${BASH_REMATCH[1]}    
                y_suffix=${BASH_REMATCH[2]}

                if [[ $x_prefix == $y_prefix ]] ; then
                    if ! grep "$x_prefix $x_suffix $y_suffix" output.log > /dev/null ; then
                        echo "$x_prefix $x_suffix $y_suffix" >> output.log
                    fi  
                    y_matched=1
                    continue
                fi  
            fi  
        fi  
    done    

    if [ $y_matched -ne 1 ]; then
        echo "$x_a NA  NA" >> output.log
    fi  

done

必须将xy转换为数组,我相信如果它是单个字符串,您可以找到同样的方法

票数 0
EN

Stack Overflow用户

发布于 2017-04-26 14:42:43

awk去营救!

代码语言:javascript
复制
awk -v OFS='\t' '{k=$1 FS $2 FS $3}
         NR==FNR {a[k,++c[k]]=$4 OFS $5; next}
                 {if((k,++d[k]) in a) print $0, a[k,d[k]]; 
                  else print $0, "NA", "NA"} '  <(echo "$y") <(echo "$x") | 
column -t

会产生

代码语言:javascript
复制
AA  N-1  0  OPEN  WORKING  REACHABLE  XYZ-0  PINGABLE
AA  N-1  0  OPEN  WORKING  REACHABLE  XYZ-1  PINGABLE
AA  N-1  0  OPEN  WORKING  REACHABLE  XYZ-2  PINGABLE
BB  N-1  0  OPEN  WORKING  REACHABLE  NA     NA
BB  N-1  0  OPEN  WORKING  REACHABLE  NA     NA
CC  N-1  0  OPEN  WORKING  REACHABLE  IJK-0  NOT-PINGABLE
DD  N-1  0  OPEN  WORKING  REACHABLE  NA     NA
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43626725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档