相关疑难解决方法(0)

awk '!a[$0]++' 如何工作?

这种单行从文本输入中删除重复的行,无需预先排序。

例如:

$ 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 究竟是如何解释这个符号的。例如,爆炸符号 ( !) 的含义以及此代码片段的其他元素。

它是如何工作的?

awk text-processing

59
推荐指数
3
解决办法
3万
查看次数

从 CSV 文件中删除重复条目

我有一个 [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)

text-processing files

16
推荐指数
1
解决办法
5万
查看次数

使用 CSV 解析器根据特定列对 CSV 行进行重复数据删除

我搜索了这个任务,发现了以下较旧的问题:

但我无法使用,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)

但这是一个错误。

linux csv miller csvkit

6
推荐指数
2
解决办法
388
查看次数

标签 统计

text-processing ×2

awk ×1

csv ×1

csvkit ×1

files ×1

linux ×1

miller ×1