使用linux命令行工具一对多

时间:2017-06-23 10:34:27

标签: linux command-line

我有一个像这样的对的列表:

12 23
14 54
33 21
12 44
14 54
33 52

我试图选择与多个不同的右手值配对的所有左手值(母亲/孩子关系适用于有多个孩子的母亲)。所以对于这些数据,我想要

12 23
12 44
33 21
33 52

(顺序并不重要)

我可以使用标准的Linux文本工具吗?

有人用不同的意思重新构思我的问题,我不知道为什么,从问题的角度来看,他的改变是完全错误的。请撤销你的改变,不要分散他人的注意力 我只想选择第一列的编号在第二列中具有多个对的行。 在结果中我想得到12只或宽度对12 23,12 b

3 个答案:

答案 0 :(得分:2)

sort -u filename|awk '{a[$1]++;b[NR]=$0;c[NR]=$1;}END{for(i=1;i<=NR;i++)if(a[c[i]]>1)print b[i];}'

sort -u将只打印唯一的行,并使用awk打印行打印您想要的内容。

答案 1 :(得分:0)

试试这个:

grep ^12 listfilename

答案 2 :(得分:0)

以下是 bash 中的解决方案。它还取决于 echo cat cut 排序 wc

首先让我们重新创建输入数据文件,这样任何人都可以快速测试代码:

rm input
echo "12 23" >> input
echo "14 54" >> input
echo "33 21" >> input
echo "12 44" >> input
echo "14 54" >> input
echo "33 52" >> input

我们将a命名为第一个号码,b命名为第二个号码。

对于每个a,创建了一个名为list_$a的文件,并填充了与b相关联的所有a

while read line; do
  a=$(echo $line | cut -d" " -f1)
  b=$(echo $line | cut -d" " -f2)
  echo $b >> "list_$a"
done < input

然后使用命令sort -u

将列表转换为集合
for l in list_*; do
  cat $l | sort -u > ${l/list/set}
done

对于包含多行的每个设置文件,让我们显示前缀为b的每个a

for s in set_*; do
  n=$(cat $s | wc -l)
  if [ "$n" -gt "1" ]; then
    a=${s/set_/}
    while read b; do
      echo "$a $b"
    done < $s
  fi
done

应显示预期输出:

12 23
12 44
33 21
33 52

最后,让我们清理临时文件:

rm list_* set_*