我有这样的数据(文件被称为list-in.dat)
a ; b ; c ; i
d
e ; f ; a ; b
g ; h ; i
Run Code Online (Sandbox Code Playgroud)
并且我想要一个这样的列表(输出文件list-out.dat),其中包含所有项目,按字母顺序(不区分大小写)和每个唯一项目仅一次。
a
b
c
d
e
f
g
h
i
Run Code Online (Sandbox Code Playgroud)
我的尝试是:
awk -F " ; " ' BEGIN { OFS="\n" ; } {for(i=0; i<=NF; i++) print $i} ' file-in.dat | uniq | sort -uf > file-out.dat
Run Code Online (Sandbox Code Playgroud)
但我最终得到了所有的蚂蚁,除了那些只有一个项目的行:
a
b
c
e
f
g
h
i
Run Code Online (Sandbox Code Playgroud)
无论一行中有多少项目/如果缺少字段分隔符,我如何获得所有(唯一的、已排序的)项目?
我的数据集如下所示:
lastname|name|hash
A|B|C
D|E|
G|H|I J
Run Code Online (Sandbox Code Playgroud)
我需要awkbash中这种格式的数据(最好带有)。
{C}% B A
{I}% H G
{J}% H G
Run Code Online (Sandbox Code Playgroud)
换句话说:仅当hash我想输出的第三列 ( )有值时。第三列 ( hash) 中可以有 1-n 个值,对于每个值,输出应如下所示:
{hash}% name lastname
我有两个文件需要比较和映射多行匹配的值。
我的映射文件 ( map.csv) 看起来像:
id,name
123,Hans
123,Britta
232,Peter
343,Siggi
343,Horst
Run Code Online (Sandbox Code Playgroud)
数据文件 ( data.csv) 是
contact,id,names
m@a.de,123,
ad@23.com,343,
adf@er.org,123,
af@go.er,232,
llk@fh.com,343,
ad@wer.org,789,
Run Code Online (Sandbox Code Playgroud)
不想要的输出应该是这样的
contact,id,names
m@a.de,123,Hans Britta
ad@23.com,343,Siggi Horst
adf@er.org,123,Hans Britta
af@go.er,232,Peter
llk@fh.com,343,Siggi Horst
ad@wer.org,789,NO ENTRY
Run Code Online (Sandbox Code Playgroud)
映射文件中的一个 ID 有多个值,它们应该以空格分隔打印到names数据文件的列中。如果映射文件中没有 ID,则应打印“NO ENTRY”。
这是 awk 命令
awk 'NR==FNR{a[$1];next}{print $0,($2 in a)? a[$2]:"NO ENTRY"}' map.csv data.csv
Run Code Online (Sandbox Code Playgroud)
我显然失败了,因为我不知道如何遍历映射文件以将多个值获取到一个 id(或当前任何值)。