这种单行从文本输入中删除重复的行,无需预先排序。
例如:
$ cat >f
q
w
e
w
r
$ awk '!a[$0]++' <f
q
w
e
r
$
Run Code Online (Sandbox Code Playgroud)
我在互联网上找到的原始代码如下:
awk '!_[$0]++'
这让我更加困惑,因为我认为_
awk 中有一个特殊的含义,就像在 Perl 中一样,但结果证明它只是一个数组的名称。
现在,我理解了单行背后的逻辑: 每个输入行都用作散列数组中的键,因此,在完成后,散列包含按到达顺序排列的唯一行。
我想了解的是 awk 究竟是如何解释这个符号的。例如,爆炸符号 ( !
) 的含义以及此代码片段的其他元素。
它是如何工作的?
我有一个 [csv] 文件,其中重复打印了重复数据,即打印了两次相同的数据。我试过使用sort 的 uniq
bysort myfile.csv | uniq -u
但是没有变化myfile.csv
,我也试过sudo sort myfile.csv | uniq -u
但没有区别。
所以目前我的 csv 文件看起来像这样
a
a
a
b
b
c
c
c
c
c
Run Code Online (Sandbox Code Playgroud)
我想看起来像
a
b
c
Run Code Online (Sandbox Code Playgroud) 我搜索了这个任务,发现了以下较旧的问题:
但我无法使用,awk
因为我的数据是一个复杂的 CSV 文件,带有多个嵌套双引号。
假设我想对以下内容进行重复数据删除(简化情况):
Ref,xxx,zzz
ref1,"foo, bar, base",qux
ref1,"foo, bar, base",bar
ref2,aaa,bbb
Run Code Online (Sandbox Code Playgroud)
在输出中我需要它如下:
Ref,xxx,zzz
ref1,"foo, bar, base",qux
ref2,aaa,bbb
Run Code Online (Sandbox Code Playgroud)
没有awk
解决方案,只能使用任何 CSV 解析器。
我尝试了以下方法:
mlr --csv uniq -a -g Ref file.csv
Run Code Online (Sandbox Code Playgroud)
但这是一个错误。