输入 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)
。