如何删除 awk 中的重复行

  • 本文关键字:awk 何删除 删除 awk
  • 更新时间 :
  • 英文 :


我有一个像这个例子这样的大文本文件:

example

chr1    109472560   109472561   -4732   CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109477498   109477499   206 CLCC1

有一些重复的行,我只想重复一次。 对于上面的示例,预期输出如下所示:

chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1

我正在尝试使用以下命令在awk中执行此操作:

awk myfile.txt | uniq > uniq_file_name.txt

但输出为空。你知道怎么解决吗?

编辑: 由于 hek2mgl 先生提到如果您需要删除连续的相似行,请尝试以下操作。

假设以下内容Input_file:

cat Input_file
chr1    109472560   109472561   -4732   CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109472560   109472561   -4732   CLCC1

立即运行以下代码:

awk 'prev!=$0;{prev=$0}'  Input_file

输出将如下所示。

chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109472560   109472561   -4732   CLCC1


以下代码片段将删除所有重复的行,而不仅仅是重复的行

awk '!a[$0]++'  Input_file

> output_file附加到上述命令,以防要将输出放入单独的文件中。

说明现在为上述代码添加说明。这只是为了解释运行上述代码使用的目的。

awk '
!a[$0]++      ##Checking condition here if current line is present in array a index or NOT, if not then increase its value by 1.
##So that next time it will make condition as FALSE, since we need to have only unique lines.
##awk works on method of condition and action, so if condition is TRUE it will do some action mentioned by programmer.
##Here I am not mentioning action so by default print of current line will happen, whenever condition is TRUE.
'  Input_file  ##mentioning Input_file name here.

这是为了显示uniqawk '!a[$0]++'sort -u之间的区别。

uniq删除重复的重复行,保持顺序:

$ echo "bnbnanbnb" | uniq
b
a
b

awk !a[$0]++:删除所有重复项,保持秩序

$ echo "bnbnanbnb" | awk '!a[$0]++'
b
a

sort -u:删除所有重复项并对输出进行排序

$ echo "bnbnanbnb" | sort -u
a
b

您的命令:

$ awk myfile.txt | uniq > uniq_file_name.txt

更准确地说,这部分:

$ awk myfile.txt

将挂起,因为没有程序或脚本可供 awk 执行。打印所有行所需的最低操作是:

$ awk 1 myfile.txt

但是由于您没有 awk 脚本,我假设您不需要 awk,那么只需使用uniq(也取决于您的需要):

$ uniq myfile.txt
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1

$ sort myfile.txt | uniq

对于该输入将产生相同的输出。

更新

关于评论中关于为什么要排序的讨论:如果重复的行意味着文件中的所有重复记录,请使用sort.如果这意味着连续重复的行忘记sort

使用 Perl

> cat user106.txt
chr1    109472560   109472561   -4732   CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109477498   109477499   206 CLCC1
> perl -ne ' print if $kv{$_}++ == 1 ' user106.txt
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
>

删除重复行

> echo "anbnbnbncncndna" | perl -ne ' print if $prev ne $_ ; $prev=$_ ' -
a
b
c
d
a
>

最新更新