我希望看到我们从以下问题中得到的不同类型的答案。我很想看到下面的问题通过数组或任何其他匹配(如果有的话)完全解决。
以下是问题所在。保持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
答案 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