我有一个像这样的对的列表:
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
答案 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_*