unix - 在unix中获取逗号分隔的不同值

标签 unix awk

我有一个 unix 文件 Err_Call_sipregtracking.csv 如下

colnum~filename~date~fieldnum~name~value
15~YYYYMMDD_BDACA_SELFRELATIVE_ARN~30MAR2016:00:00:00~1~BDA_CA_Code~1
15~YYYYMMDD_BDACA_SELFRELATIVE_ARN~30MAR2016:00:00:00~2~ARN_Code~2
15~YYYYMMDD_BDACA_SELFRELATIVE_ARN~30MAR2016:00:00:00~544~ALL~0
15~YYYYMMDD_BDACA_SELFRELATIVE_ARN~30MAR2016:00:00:00~544~ALL~0

这里的分隔符是 ~ .
我想将 name 列的不同值转换为变量

我需要的输出是:
'BDA_CA_Code','ARN_Code','ALL'

请帮我实现这个。我试过这个
cat Err_Call_sipregtracking.csv | awk -F'~' '{print $5}' | uniq

输出是:
name
BDA_CA_Code
ARN_Code
ALL

但我不想在结果中包含标题,我也希望它们用引号和逗号分隔。

最佳答案

这里的关键是将值存储在一个数组中,然后打印所有元素:

$ awk -F'~' 'NR>1{item[$5]} END {for (i in item) print i}' file
ARN_Code
BDA_CA_Code
ALL

注意使用 NR>1 跳过标题。

然后,您可以使用 printf "\047%s\047\n", i 打印用单引号包裹的元素,因为 print "\047hello\047" 打印 'hello' :
$ awk -F'~' 'NR>1{item[$5]} END {for (i in item) printf "\047%s\047\n", i}' file
'ARN_Code'
'BDA_CA_Code'
'ALL'

要将这些加入以逗号分隔的项目列表,只需在从第二个 ( credits to Ed Morton ) 开始的每个项目之前打印一个逗号:
for (i in item) printf "%s\047%s\047", (++c>1 ? "," : ""), i
print ""

看看它在行动:
$ awk -F'~' 'NR>1{item[$5]} END {for (i in item) printf "%s\047%s\047", (++c>1 ? "," : ""), i; print ""}' file
'ARN_Code','BDA_CA_Code','ALL'

关于unix - 在unix中获取逗号分隔的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38654568/

相关文章:

c - 套接字文件系统与普通磁盘文件系统

cocoa - 将 CFPropertyList 保存到用户文件夹

linux - UNIX:如何将IP地址转换为二进制代码

parsing - 读取半格式化数据

c - 使用 write() 在 C 中写入文件时出现随机符号

linux - sun solaris 全新安装上的 crontab -e 问题

sed - awk, sed : one liner command for removing spaces from _all_ file names in a given folder?

bash - 识别带引号空格的列

java - 如何按列值分组到行和列标题中,然后动态对列求和

bash - 使用 AWK 或 Sed 如何删除第一个 txt 之前的尾随回车符和换行符