在单个文件中处理多种类型的字段分隔符

在单个文件中处理多种类型的字段分隔符

源文件包含逗号分隔字段和管道分隔字段。它还包含以逗号和竖线分隔的重复标头记录。

** 源文件 **

FOOID|BIZNO|BARBIZ_CODE
00033567|0035952|A,KEEP
00034145|0036865|A,KEEP
FOOID|BIZNO|BARBIZ_CODE
00030527|0032479|Z4,KEEP
00034984|0037987|Z5,KEEP
FOOID|BIZNO|BARBIZ_CODE
00021826|0022008|Z5,KEEP
00026763|0029293|Z5,KEEP
FOOID,BIZNO,BARBIZ_CODE
A0021826,Q022008,Z5,TRASH
B0021826,R022009,Z5,TRASH
C0021826,S022018,Z5,TRASH
FOOID,BIZNO,BARBIZ_CODE

我只想保留一个管道分隔标头和所有管道分隔记录。

忽略以下内容:

  1. 所有逗号分隔字段记录和标题

  2. 重复的管道分隔标头。

假设

  1. 管道分隔符标头中的第一个字段 = FOOID

  2. 管道分隔字段可以包含逗号。

此 awk 脚本从我的文件中删除重复的管道标头。我怎样才能让它忽略所有 CSV 记录?

#!/usr/bin/awk -f
BEGIN{ FS="|"
      header_f1 = "FOOID" }
{
if (NR==1) { print $0 }
if (NR>1 && $1 != header_f1 && length > 1) { print $0 }
}

期望的结果

FOOID|BIZNO|BARBIZ_CODE
00033567|0035952|A,KEEP
00034145|0036865|A,KEEP
00030527|0032479|Z4,KEEP
00034984|0037987|Z5,KEEP
00021826|0022008|Z5,KEEP
00026763|0029293|Z5,KEEP

答案1

鉴于您的示例输入,这似乎有效:

$ awk 'NR == 1 { print } /,/ && /\|/ { print }' input
FOOID|BIZNO|BARBIZ_CODE
00033567|0035952|A,KEEP
00034145|0036865|A,KEEP
00030527|0032479|Z4,KEEP
00034984|0037987|Z5,KEEP
00021826|0022008|Z5,KEEP
00026763|0029293|Z5,KEEP

始终打印第一条(标题)记录;此后仅打印带有逗号和竖线的记录。

答案2

短的awk方法:

awk -F'|' 'NR==1{ h=$1; print }NF>1 && NR>1 && $0!~"^"h' file
  • -F'|'-|视为字段分隔符
  • NR==1{ h=$1; print }- 遇到第一个记录时,将第一个标头字段分配$1给变量h(作为标头行指示)
  • NF>1- 打印至少有 2 个“ |”分隔字段的记录
  • $0!~"^"h- 额外检查以确保记录不存在涉及到标题行

输出:

FOOID|BIZNO|BARBIZ_CODE
00033567|0035952|A,KEEP
00034145|0036865|A,KEEP
00030527|0032479|Z4,KEEP
00034984|0037987|Z5,KEEP
00021826|0022008|Z5,KEEP
00026763|0029293|Z5,KEEP

相关内容