我有一个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是当前处理时间戳记。
要求您提供帮助。还要求对建议的代码进行解释。
答案 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的文档