使用shell进行密钥匹配

时间:2015-09-27 17:17:18

标签: bash shell

我希望看到我们从以下问题中得到的不同类型的答案。我很想看到下面的问题通过数组或任何其他匹配(如果有的话)完全解决。

以下是问题所在。保持Name为关键,我们需要在一行中打印各种电话号码。

$cat input.txt

Name1, Phone1
Name2, Phone2
Name3, Phone1
Name4, Phone5
Name1, Phone2
Name2, Phone1
Name4, Phone1

O / P:     $ cat output.txt

Name1,Phone1,Phone2
Name2,Phone2,Phone1
Name3,Phone1
Name4,Phone5,Phone1

我解决了上述问题,但我希望看到一种解决方法可能比我更有效。我还不是初学者级别的shell专家。我的代码如下:

$cat keyMatchingfunction.sh
while read LINE; do
    var1=(echo "$LINE"|awk -F\, '{ print $1 }')
    matching_line=(grep "$var1" output.txt|wc -l)
    if [[ $matching_line -eq 0 ]]; then
    echo "$LINE" >> output.txt
    else
    echo $LINE is already present in output.txt
    grep -q -n "$var1" output.txt
    line_no=(grep -n "$var1" output.txt|cut -d: -f1)
    keymatching=(echo "$LINE"|awk -F\, '{ print $2 }')
    sed -i "$line_no s/$/,$keymatching/" output.txt
    fi
done

2 个答案:

答案 0 :(得分:3)

试试这个:

awk -F', ' '{a[$1]=a[$1]","$2}END{for(i in a) print i a[i]}' input.txt

输出:

Name1,Phone1,Phone2
Name2,Phone2,Phone1
Name3,Phone1
Name4,Phone5,Phone1

答案 1 :(得分:1)

使用bash和sort:

#!/bin/bash

declare -A array         # define associative array

# read file input.txt to array
while IFS=", " read -r line number; do
  array["$line"]+=",$number"
done < input.txt

# print array
for i in "${!array[@]}"; do
  echo "$i${array[$i]}"
done | sort 

输出:

Name1,Phone1,Phone2
Name2,Phone2,Phone1
Name3,Phone1
Name4,Phone5,Phone1