源文件包含逗号分隔字段和管道分隔字段。它还包含以逗号和竖线分隔的重复标头记录。
** 源文件 **
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
我只想保留一个管道分隔标头和所有管道分隔记录。
忽略以下内容:
所有逗号分隔字段记录和标题
重复的管道分隔标头。
假设
管道分隔符标头中的第一个字段 = FOOID
管道分隔字段可以包含逗号。
此 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