我有一个大文本文件,例如以下示例:
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
,但输出为空。你知道如何解决吗?
答案 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)
这是为了显示uniq
,awk '!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
>