如果前一行匹配,则使用Bash csv删除行

com*_*y24 2 bash awk

我有一个像这样的csv文件:

"a", "b", "c" 
"1", "b", "4"
"3", "g", "f"
Run Code Online (Sandbox Code Playgroud)

无论何处"b"出现在与两个连续行中的第二列值相同的位置,我想删除第二行,从而导致:

"a", "b", "c" 
"3", "g", "f"
Run Code Online (Sandbox Code Playgroud)

这至少让我开始解析:

awk -F "," '$1' file.csv
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 8

这会在第二列重复时删除一行:

$ awk -F, '$2==last{next} {last=$2} 1' file.csv
"a", "b", "c" 
"3", "g", "f"
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

  • $2==last{next}

    如果第二列,$2等于前一个第二列last,则跳过此并转到该next行.

  • last=$2

    更新值last.

  • 1

    这是"打印线"的神秘简写.

变化1

如果我们只想删除第二列等于"b"前一行重复的行,则:

awk -F, '$2==last && $2==" \"b\"" {next} {last=$2} 1' file.csv
Run Code Online (Sandbox Code Playgroud)

变化2

假设我们只想删除每隔一次出现的行"b":

awk -F, '$2==last && $2==" \"b\"" {last="";next} {last=$2} 1' file.csv
Run Code Online (Sandbox Code Playgroud)

变化3

假设我们想要跳过第二列的任何行,"b"如果它后跟一行具有相同的第二列.然后:

awk -F, '$2==last && $2==" \"b\"" {line=$0;next} NR>1{print line} {last=$2;line=$0} END{print line}' file.csv
Run Code Online (Sandbox Code Playgroud)