我想使用 awk 删除以前记录的记录库?

我想使用 awk 删除以前记录的记录库?

输入 CSV 文件:

I,TEST1
H,TEST2
H,TEST3
I,TEST4
I,TEST5
H,TEST6
I,TEST7

输出文件:

I,TEST1
H,TEST2
I,TEST4
I,TEST5
H,TEST6
I,TEST7

H仅当类型记录后面有多个类型记录时才删除I。保留第一个类型H并删除其余的...

答案1

这看起来没问题:

$ cat file1
I,TEST1
H,TEST2
H,TEST3
I,TEST4
I,TEST5
H,TEST6
H,TEST7
H,TEST9
I,TEST10
H,TEST11

$ awk -F"," '/^I/{print;f=1};/^H/ && f==1 && !seen[$1]++{print;seen[$1]=0;f=0}' file1
I,TEST1
H,TEST2
I,TEST4
I,TEST5
H,TEST6
I,TEST10
H,TEST11

答案2

$ awk -F, '($1 == "I" || $1 != p) && p = $1' file.csv
I,TEST1
H,TEST2
I,TEST4
I,TEST5
H,TEST6
I,TEST7
  • 如果一行的第一列是I,则变量p(“上一页”)将设置为该I行并打印该行。
  • 如果第一列是不是 I但与之前的也不一样(即它不是重复 H),然后将变量p设置为该变量H并打印该行。
  • 如果第一列不是I,并且它也与之前的第一列相同,则该行将被忽略。

这将删除第一列与前一个第一列相同的所有行,但I第一列为第一列的行除外。

我将作业p = $1用作条件。如果执行它,并且该值非零(在给定问题中的示例数据的所有实例中,该值都将非零),那么它将产生打印当前行的副作用。

如果第一列包含零,则将 更改p = $1((p = $1) || 1)

相关内容