带有两列选项卡的Bash文本文件在第二列中分开,并在匹配唯一时在第一列旁边打印

时间:2018-10-19 09:06:12

标签: bash shell scripting

例子是这个

192.168.1.1 xyz_user
192.168.5.1 ddd_user
192.168.1.1 abc_user
192.168.6.1 byd_user

我需要的是输出。

192.168.1.1 xyz_user,abc_user
192.168.5.1 ddd_user
192.168.6.1 byd_user 

我应该如何处理?

2 个答案:

答案 0 :(得分:0)

为此使用awk工具

awk '{ Usr[$1]= (Usr[$1]!=""?Usr[$1] "," $2: $2) }
END  { for (x in Usr) print x, Usr[x] }' infile
192.168.5.1 ddd_user
192.168.6.1 byd_user
192.168.1.1 xyz_user,abc_user

在这里,我们将第二列值作为属于同一IP的用户添加到一个数组值中,该IP是其在该数组中的键标识符。

三元条件(Usr[$1]!=""?Usr[$1] "," $2: $2)用于在找到相同相关IP的每个用户之间添加逗号,并且如果该IP的值仍未设置,则可以防止出现逗号。

答案 1 :(得分:0)

假设您将结果输出到临时文件 /tmp/bashTest.txt 中。

您可以按以下方式获得想要的结果:

for ipAddress in $( cat /tmp/bashTest.txt |awk '{print $1}' |sort -u ); do
  echo -ne "$ipAddress\t";
  for name in $( cat /tmp/bashTest.txt |grep -e "^$ipAddress" |awk '{print $2}' ); do
    echo -ne "$name,";
  done;
  echo "";
done

让我知道是否足以解决您的问题。