如何在awk中删除重复的行

时间:2018-12-12 11:38:17

标签: 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

,但输出为空。你知道如何解决吗?

4 个答案:

答案 0 :(得分:2)

编辑: 由于提到了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.

答案 1 :(得分:2)

您的命令:

$ 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

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

更新

关于为什么排序的注释中的讨论:如果重复的行表示文件中所有重复的记录,请使用{{1} }。如果这意味着连续重复的行,请忘记sort

答案 2 :(得分:2)

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

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

$ echo "b\nb\na\nb\nb" | uniq
b
a
b

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

$ echo "b\nb\na\nb\nb" | awk '!a[$0]++'
b
a

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

$ echo "b\nb\na\nb\nb" | sort -u
a
b

答案 3 :(得分:1)

使用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 "a\nb\nb\nb\nc\nc\nd\na" | perl -ne ' print if $prev ne $_ ; $prev=$_ ' -
a
b
c
d
a
>