文本处理以创建唯一ID的列表

时间:2018-10-18 06:48:12

标签: awk sed

我有一个ID和名称适用的文件,如下所示:

1234|abc|cde|fgh
5678|ijk|abc|lmn
9101|cde|fgh|klm
1213|klm|abc|cde

我需要一个只有唯一名称作为列表的文件。

输出文件:

abc|sysdate
cde|sysdate
fgh|sysdate
ijk|sysdate
lmn|sysdate
klm|sysdate

sysdate是当前处理时间戳记。

要求您提供帮助。还要求对建议的代码进行解释。

1 个答案:

答案 0 :(得分:0)

此代码的作用:

awk -F\| '{ for(i=2; i <= NF; i++) a[$i] = a[$i] FS $1 }' input.csv

-F将定界符设置为|,awk逐行处理文件,创建一个名为“ a”的映射,从第2列读取直到结尾,并使用作为键处理的当前单元格和当前单元格+填充该映射文件分隔符+第一栏中的值作为值。

awk结束处理第一行时,“ a”为:

a['abc'] = 'abc|1234'
a['cde'] = 'cde|1234'
a['fgh'] = 'fgh|1234'

此脚本不打印任何内容。

您想要的是这样的:

awk -F'|' '{for(i=2;i<=NF;i++){if(seen[$i] != 1){print $i, strftime(); seen[$i]=1}}}' OFS='|' input.csv

-F将输入定界符设置为|,OFS对输出定界符也是如此。 对于从第2列到行尾的每个值,我们检查它是否以前已经被看到过。如果没有,我们将打印值和处理时间。然后,我们将值注册在映射中,这样就可以避免再次处理它。

输出:

abc|Thu Oct 18 10:40:13 CEST 2018
cde|Thu Oct 18 10:40:13 CEST 2018
fgh|Thu Oct 18 10:40:13 CEST 2018
ijk|Thu Oct 18 10:40:13 CEST 2018
lmn|Thu Oct 18 10:40:13 CEST 2018
klm|Thu Oct 18 10:40:13 CEST 2018

您可以更改sysdate的格式。请参阅gawk strftime here的文档