问题描述:
我有一个 csv 格式name,id,logindate,其中 logindates 显示为"July 15, YYYY HH:mm:ss"ie abc,123,"July 15, YYYY HH:mm:ss"。请注意,前 5 行中应跳过标题和其他信息。因此,示例 csv 文件可能如下所示:
AuditReport
asdf
qwerty
asdf
name, id, logindate
experiment,182002, "July 31, 2022 20:00:00"
unit 1998,183065, "July 3, 2022 21:00:00"
asdf, 202065, "May 25, 2022 20:00:00"
对于我的输出,我想获得以下内容(标题已删除):
experiment,182002, "July 31 2022 20:00:00"
unit 1998,183065, "July 3 2022 21:00:00"
asdf, 202065, "May 25 2022 20:00:00"
我的主要任务是即使在字符串中包含逗号也能够正确解析逗号
经过大量谷歌搜索和几个 SO 问题后,我得出结论,使用 csv 解析器、其他语言,甚至 GNU awk(使用 FPAT)是一个更好的工具,但我被告知生产服务器在我父亲工作的公司使用 awk,并且被认为不是 gawk。(我正在做一些随机的小任务,为自己找工作做准备)
我试图通过删除“”并通过 FS="," 解析来解决此问题,然后再次将最后两列连接在一起。但是,我的输出一直给我 4 列(无法将最后两列连接成一列)
我的代码是:
/usr/bin/env awk {BEGIN{FS=","} NR>5 {print}' sample.csv | awk '{ gsub("\"", "") } { $1=$1 } 1' | awk '{ print $1, $2, $3" "$4 }' > test.csv
解决思路一:
一旦通过设置检测到标题行,您就不必担心逗号解析
-
FS = "^$
echo "${_input_data_}" |
mawk '_+=(!__<NF)*NR { FS="^$" } _<NR' FS=','
experiment,182002, "July 31, 2022 20:00:00"
unit 1998,183065, "July 3, 2022 21:00:00"
asdf, 202065, "May 25, 2022 20:00:00"
解决思路二:
使用您显示的示例,请尝试以下awk
代码。用 GNU 编写和测试awk
,应该可以在任何 POSIXawk
版本中工作。根据 OP 的要求,使用awk
'smatch
函数在其中使用正则表达式"[a-zA-Z]+ [0-9]{1,2}, [0-9]{4} [0-9]{2}(:[0-9]{2}){2}[^"]*"
来获得预期的结果。然后在打印值时使用 substr(获取子字符串)。
awk '
match($0,/"[a-zA-Z]+ [0-9]{1,2}, [0-9]{4} [0-9]{2}(:[0-9]{2}){2}[^"]*"/){
val=substr($0,RSTART+1,RLENGTH-2)
gsub(/,/,"",val)
print substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
}
' Input_file
或者,如果您想保留"所需值的前后,则对上述代码稍作更改即可:
awk '
match($0,/"[a-zA-Z]+ [0-9]{1,2}, [0-9]{4} [0-9]{2}(:[0-9]{2}){2}[^"]*"/){
val=substr($0,RSTART,RLENGTH)
gsub(/,/,"",val)
print substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
}
' Input_file
解决思路三(这是解决小编问题的思路):
以上仅为部分解决思路介绍,请查看全部内容,请添加下方公众号后回复001,即可查看。公众号有许多评分最高的编程书籍和其它实用工具,绝对好用,可以放心使用
如果您觉得有帮助,可以关注公众号——定期发布有用的资讯和资源