我有一个像这个例子这样的大文本文件:
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.
这是为了显示uniq
、awk '!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
>