我正在尝试将两列合并为一列。我的数据集如下所示:
RSID1 RSID2
rs7475652 rs7475652
rs7475652 rs7918643
rs7475652 rs3125034
rs7475652 rs3750730
rs7475652 rs883728
rs7475652 rs4881500
rs7475652 rs3853288
rs7475652 rs4881504
rs7475652 rs2242271
rs7475652 rs7099607
rs7475652 rs10904597
rs7475652 rs3207775
正如您所看到的,有一些重复值。我想首先将第 2 列与第 1 列合并,然后我计划使用uniq
命令删除任何重复项。我想合并这两列,然后删除重复的列。
以下是此示例的预期输出的第一部分:
rs7475652
rs7475652
rs7475652
rs7918643
rs7475652
rs3125034
rs7475652
rs3750730
rs7475652
rs883728
答案1
猜测这个问题意味着期望的输出是
RSID1
RSID2
rs7475652
rs7475652
rs7475652
rs7918643
rs7475652
rs3125034
rs7475652
rs3750730
rs7475652
rs883728
rs7475652
rs4881500
rs7475652
rs3853288
rs7475652
rs4881504
rs7475652
rs2242271
rs7475652
rs7099607
rs7475652
rs10904597
rs7475652
rs3207775
然后
awk '{print $1 "\n" $2}'
会做的。 awk 还可以处理 OP 想要执行的下一步,使输出唯一。执行此操作的代码取决于输出是否应该是成对唯一的(因此每一行都与前一行不同),或者是全局唯一(其中每一行都与之前的所有行不同)。
答案2
@icarusawk
实际上只是替换为
\n
,您可以使用其他工具实现相同的目标,例如
cat file | tr ' ' '\n' # Naughty me! See UUOC below.
或者
sed "s/ /\n/g" file
这些会将由 2 个或更多元素组成的空格分隔行减少为单个“列”,或者更正确地说,将每个元素放在其自己的行上。
至于评论中指出的额外空间......
sed "s/ /\n/g" file | tr -d ' '
引入额外的复杂性会让awk
一切变得更有吸引力,但在这种情况下我们也可以
grep -Po "[^ ]+" file
我要向@edmorton 和团队表示感谢,感谢他们获得了这个奇妙的奖项,同时也感谢我的朋友和同事,是他们让这一切成为可能。不要忘记我的狗、Spot 等。它将在我的 ZX-80 和自 1980 年以来一直优雅地堆积在水槽中的用过的勺子旁边占据一席之地。
从下面提升@edmorton 评论
tr ' ' '\n' < file
答案3
考虑到文件名是a.txt,分隔符是\t,我们可以使用以下命令:
cat a.txt | awk -F"\t" '{print $1 "\n" $2}' > b.txt
现在 b.txt 将包含预期的输出