bash - 如何将 awk 结果变量分配给数组,是否可以在循环中的另一个 awk 中使用 awk
问题描述
我已经开始学习 bash 并且完全坚持这项任务。我有一个逗号分隔的 csv 文件,其中包含以下记录:
id,location_id,organization_id,service_id,name,title,email,department
1,1,,,Name surname,department1 department2 department3,,
2,1,,,name Surname,department1,,
3,2,,,Name Surname,"department1 department2, department3",, e.t.c.
我需要这样格式化:名字和姓氏必须以大写字母开头
- 添加由姓名的第一个字母和小写全姓组成的电子邮件记录
- 创建一个新的 csv,其中包含来自旧 csv 的记录以及更正的字段。
我使用 awk 在记录上拆分 csv (因为某些字段包含在引号"department1 department2, department3"之间用逗号分隔的字段)。
#!/bin/bash
input="$HOME/test.csv"
exec 0<$input
while read line; do
awk -v FPAT='"[^"]*"|[^,]*' '{
...
}' $input)
done
在 awk {...} (每条记录的 NF=8)中,我尝试使用某些字段值($1 $2 $3 $4 $5 $6 $7 $8):
#it doesn't work
IFS=' ' read -a name_surname<<<$5 # Field 5 match to *name* in heading of csv
# Could I use inner awk with field values of outer awk ($5) to separate the field value of outer awk $5 ?
# as an example:
# $5="${awk '{${1^}${2^}}' $5}"
# where ${1^} and ${2^} fields of inner awk
name_surname[0]=${name_surname[0]^}
name_surname[1]=${name_surname[1]^}
$5="${name_surname[0]}' '${name_surname[1]}"
email_name=${name_surname[0]:0:1}
email_surname=${name_surname[1]}
domain='@domain'
$7="${email_name,}${email_surname,,}$domain" # match to field 7 *email* in heading of csv
如何将字段值($1 $2 $3 $4 $5 $6 $7 $8)添加到数组并 为每个for 循环迭代调用函数连接以将记录添加到新的 csv 文件?
function join { local IFS="$1"; shift; echo "$*"; }
result=$(join , ${arr[@]})
echo $result >> new.csv
解决方案
这可能是您正在尝试做的(使用 gawk 进行 FPAT 就像您已经在做的那样),但没有更具代表性的样本输入和预期输出,这是一个猜测:
$ cat tst.sh
#!/usr/bin/env bash
awk '
BEGIN {
OFS = ","
FPAT = "[^"OFS"]*|\"[^\"]*\""
}
NR > 1 {
n = split($5,name,/\s*/)
$7 = tolower(substr(name[1],1,1) name[n]) "@example.com"
print
}
' "${@:--}"
$ ./tst.sh test.csv
1,1,,,Name surname,department1 department2 department3,nsurname@example.com,
2,1,,,name Surname,department1,nsurname@example.com,
3,2,,,Name Surname,"department1 department2, department3",nsurname@example.com,
我将 awk 脚本放在 shell 脚本中,因为它看起来像你想要的,显然你不需要这样做,你可以将 awk 脚本保存在一个文件中并使用awk -f
.
推荐阅读
- c - 如何简化这个 readLine() 函数?
- javascript - 使用增强现实创建 QR 码扫描仪
- java - Java:如果发生变化,同步不会阻塞
- javascript - D3.js如何在使用新数据时更新图表
- python - 如何在 QWidget 中的 matplot 画布上跟踪鼠标?
- variables - 在函数中调用带有空格的变量
- c# - 如何判断浮点除法的结果是否应该是整数?
- android - Graphhopper - 位置索引版本不正确
- javascript - 你可以混合使用 bootstrap 3.3 和 bootstrap 4.1 吗?我试过了,它破坏了网站
- angular - AngularMatTree 似乎知道有数据,但不会显示它