我有一个包含大约100个包含数千个项目的列的Excel文件,我想删除每列中的重复项目并保留所有唯一项目。我认为'awk'命令可以帮助但不确定如何在所有列中循环它。我的数据如下所示
A B C D
BGIBMGA000028 BGIBMGA000016 BGIBMGA000016 BGIBMGA000029 BGIBMGA000029 BGIBMGA000016 BGIBMGA000028 BGIBMGA000029 BGIBMGA000029 BGIBMGA000029 BGIBMGA000029 BGIBMGA000029 BGIBMGA000029 BGIBMGA000029 BGIBMGA000029 BGIBMGA000034 BGIBMGA000034 BGIBMGA000029 BGIBMGA000029 BGIBMGA000034 BGIBMGA000034 BGIBMGA000032 BGIBMGA000029 BGIBMGA000034 BGIBMGA000064 BGIBMGA000034 BGIBMGA000034 BGIBMGA000034 BGIBMGA000064 BGIBMGA000034 BGIBMGA000034 BGIBMGA000034 BGIBMGA000064 BGIBMGA000034 BGIBMGA000034 BGIBMGA000034 BGIBMGA000064 BGIBMGA000034 BGIBMGA000034 BGIBMGA000034 BGIBMGA000066 BGIBMGA000034 BGIBMGA000034 BGIBMGA000034 BGIBMGA000086 BGIBMGA000034 BGIBMGA000034 BGIBMGA000034 BGIBMGA000086 BGIBMGA000034 BGIBMGA000034 BGIBMGA000034 BGIBMGA000097 BGIBMGA000034 BGIBMGA000034 BGIBMGA000034 BGIBMGA000097 BGIBMGA000034 BGIBMGA000034 BGIBMGA000034
例如,A列中有四个BGIBMGA000034,程序应该删除其他程序并只留下其中一个。每个单元格中只有唯一的项目。我能够编写一个awk命令,它可以删除一列中的重复项,但我想循环使用相同的命令,以便它可以遍历所有列并删除所有重复项...下面的命令
$awk '!x[$1]++' file
答案 0 :(得分:1)
(1)你说数据是CSV格式但我看不到任何逗号,所以不清楚是什么格式
数据实际上是。从您的示例中,看起来列是以空格分隔的,
所以我将在接下来的大部分内容中使用awk,但是你可能需要使用awk的-F选项;或者你可以使用cut
或其他工具。
(2)第1栏中的独特项目可以通过
轻松获得 awk '{print $1}' | sort -u
与其他专栏类似。
(3)如果目标是采用4列输入并产生4列输出,假设上面(2)中的列可以简单地粘贴在一起,那么你可以编写以下内容,假设$ IN指输入文件:
#!/bin/bash
IN="$1"
function u { awk -v n="$1" '{print $n}' | sort -u ; }
paste <(u 1 < "$IN") <(u 2 < "$IN") <(u 3 < "$IN") <(u 4 < "$IN")
当然有很多变化,但也许上述内容足以让您自己解决问题或制定更精确的问题。