![如何使用 awk 和值中的管道从管道分隔文件中删除重复项?](https://linux22.com/image/204443/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20awk%20%E5%92%8C%E5%80%BC%E4%B8%AD%E7%9A%84%E7%AE%A1%E9%81%93%E4%BB%8E%E7%AE%A1%E9%81%93%E5%88%86%E9%9A%94%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%A0%E9%99%A4%E9%87%8D%E5%A4%8D%E9%A1%B9%EF%BC%9F.png)
我正在尝试使用此方法从管道分隔文件中删除基于多列的重复项如何基于多个动态列删除重复项 但我发现双引号中的值中有管道,如下所示
3|XX|""|2022-04-05T21:39:22.899Z|2022-04-05T21:37:59Z|X7
3|XX|"2025035|6|15|0|0|15|39"|2022-04-05T21:39:22.899Z|2022-04-05T21:37:59Z|X7
当我检查最后一列位置 6 和位置 2 时,这两行是重复的,但由于位置 3 中的管道,它不起作用。如何在下面的代码中转义双引号中的管道?
$4='2,6'
awk -v c="$4" -F'|' 'BEGIN{split(c,k,",")} {key=""; for (i in k) key=key FS $(k[i])} !seen[key]++'
TIA
答案1
使用 GNU awk 可以FPAT
:
$ awk -v c='2,6' -v FPAT='([^|]*)|("[^"]*")' 'BEGIN{split(c,k,",")} {key=""; for (i in k) key=key RS $(k[i])} !seen[key]++' file
3|XX|""|2022-04-05T21:39:22.899Z|2022-04-05T21:37:59Z|X7
如果您可以像这样嵌套双引号"foo""bar"
,则将 FPAT 分配更改为FPAT='[^|]*|("([^"]|"")*")'
看使用 awk 高效解析 csv 的最稳健方法是什么了解更多信息。