[英]Extract part of one column and save into another file using awk
我需要从csv文件中提取字段。 有两列billing_info
和key_id
。 billing_info
是一个在花括号中包含多个数据项的对象。 我需要将billing_info.id_encrypted
和key_id提取到另一个文件中。
input.csv
billing_info,key_id
{id: '1B82', id_encrypted: '1Q4AW5bwyU', address: 'san jose', phone: '13423', country: 'v73jyqgE='},bf6-96f751
output.csv
billing_info.id_encrypted,key_id
1Q4AW5bwyU,bf6-96f751
我可以知道如何使用awk命令以output.csv中提到的格式提取数据。 请帮忙
做一些假设:
<csvfile | awk -F, '
BEGIN {
getline
print "billing_info.id_encrypted,key_id"
}
{
for (i=1; i<NF; i++)
if ($i ~ /id_encrypted/)
split($i, e, /\047/)
print e[2] "," $NF
}
'
笔记:
-F,
将输入行拆分为逗号分隔的字段 BEGIN
部分处理标题
for
循环遍历所有字段(最后一个字段除外) ($i ~ /id_encrypted/)
查找包含关键字的任何内容 split
用单引号( /\\047/
)拆分该字段 print
输出找到的值,最后一个字段 这是使用awk的快速而优雅的解决方案:
awk -F ":" '{split($3,arr1,",");split($6,arr2,",");print arr1[1] "," arr2[2]}' input.csv > output.csv
附带说明:
-F ":"
使awk字段分隔符:
split($3,arr1,",")
将第三个字段除以,
分成具有2个元素的数组。
split($6,arr2,",")
由分割第六字段,
为具有2个元素的数组。
然后打印出arr1
的第一个元素和arr2
的第二个元素。
我建议您将整个输入转换为CSV,然后使用awk或Excel或任何其他工具从其中轻松提取所需的任何字段,例如:
$ cat tst.awk
BEGIN { FS=OFS="," }
FNR==1 {
split($0,hdr)
next
}
{
fld[1] = fld[2] = $0
sub(/,[^,]*$/,"",fld[1])
gsub(/^{|}$/,"",fld[1])
sub(/.*,/,"",fld[2])
# print "trace: " hdr[1] "=<" fld[1] ">" | "cat>&2"
# print "trace: " hdr[2] "=<" fld[2] ">" | "cat>&2"
numTags = split(fld[1],tags,/'[^']*'/,vals)
delete tags[numTags--]
for (tagNr=1; tagNr<=numTags; tagNr++) {
gsub(/^, *|: *$/,"",tags[tagNr])
gsub(/^'|'$/,"",vals[tagNr])
# print "trace: " tagNr ": <" tags[tagNr] "=" vals[tagNr] ">" | "cat>&2"
}
}
FNR == 2 {
for (tagNr=1; tagNr<=numTags; tagNr++) {
printf "%s.%s%s", hdr[1], tags[tagNr], OFS
}
print hdr[2]
}
{
for (tagNr=1; tagNr<=numTags; tagNr++) {
printf "\"%s\"%s", vals[tagNr], OFS
}
printf "\"%s\"%s", fld[2], ORS
}
。
$ awk -f tst.awk file
billing_info.id,billing_info.id_encrypted,billing_info.address,billing_info.phone,billing_info.country,key_id
"1B82","1Q4AW5bwyU","san jose","13423","v73jyqgE=","bf6-96f751"
上面使用GNU awk作为split()
的第四个参数。 取消注释print trace
行,以查看每个步骤在做什么。 如果删除或替换每个字段中的逗号(尤其是地址),则无需在每个输出字段周围添加双引号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.